J'ai rencontré ce problème en essayant d'étendre une classe existante de GitHub. Je vais essayer de m'expliquer, en écrivant d'abord la classe telle que je pensais qu'elle devait être, puis la classe telle qu'elle est maintenant.
Ce que j'ai pensé
namespace mycompany\CutreApi;
use mycompany\CutreApi\ClassOfVendor;
class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
public function whatever(): ClassOfVendor
{
return new ClassOfVendor();
}
}
Ce que j'ai finalement fait
namespace mycompany\CutreApi;
use \vendor\AwesomeApi\ClassOfVendor;
class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
public function whatever(): ClassOfVendor
{
return new \mycompany\CutreApi\ClassOfVendor();
}
}
Il semble donc que cette erreur se produise également lorsque vous utilisez une méthode qui renvoie une classe avec un espace de nom, et que vous essayez de renvoyer la même classe mais avec un autre espace de nom. Heureusement j'ai trouvé cette solution, mais je ne comprends pas bien l'intérêt de cette fonctionnalité dans php 7.2, pour moi il est normal de réécrire les méthodes de classes existantes selon vos besoins, y compris la redéfinition des paramètres d'entrée et/ou même le comportement de la méthode.
L'un des inconvénients de l'approche précédente est que les IDE ne pouvaient pas reconnaître les nouvelles méthodes mises en œuvre dans le module \mycompany\CutreApi\ClassOfVendor (). Donc, pour l'instant, je vais me contenter de cette implémentation.
Actuellement fait
namespace mycompany\CutreApi;
use mycompany\CutreApi\ClassOfVendor;
class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
public function getWhatever(): ClassOfVendor
{
return new ClassOfVendor();
}
}
Donc, au lieu d'essayer d'utiliser la méthode "whatever", j'en ai écrit une nouvelle appelée "getWhatever". En fait, les deux font la même chose, en retournant une classe, mais avec des espaces de noms différents, comme je l'ai décrit précédemment.
J'espère que cela pourra aider quelqu'un.
0 votes
NotJim a tout à fait raison. @waiwai933, si vous pouviez poster les en-têtes (juste la première ligne :
function customMethod( ... )
) pour chaque fonction nous pourrions vous dire le problème spécifique0 votes
Plus de détails sur le message d'erreur et les implications au moment de la compilation de PHP : bugs.php.net/bug.php?id=46851
0 votes
Duplication possible de Des normes strictes : La déclaration de ' ' doit être compatible avec ' '.
1 votes
Mon problème était qu'un argument était indiqué par son type mais je n'avais pas ajouté
use Closure;
au premier rang de ma classe (puisque l'indice de type étaitClosure
). Donc... assurez-vous de vérifier si vous ne manquez pas de dépendances de ce type.