J'ai couru dans quelque chose d'un problème avec l'utilisation de type de retour allusion en PHP 7. Ma compréhension est que l'allusion : self
signifie que vous avez l'intention pour la mise en œuvre de la classe de retourner lui-même. J'ai donc utilisé : self
dans mes interfaces pour indiquer que, mais quand j'ai essayé de mise en œuvre de l'interface j'ai eu des erreurs de compatibilité.
Ce qui suit est une simple démonstration de la question que j'ai pu croiser:
interface iFoo
{
public function bar (string $baz) : self;
}
class Foo implements iFoo
{
public function bar (string $baz) : self
{
echo $baz . PHP_EOL;
return $this;
}
}
(new Foo ()) -> bar ("Fred")
-> bar ("Wilma")
-> bar ("Barney")
-> bar ("Betty");
Le résultat attendu est:
Fred Wilma Barney Betty
Ce que j'ai fait:
PHP Fatal error: Déclaration de Foo::bar(int $baz): Foo doit être compatible avec iFoo::bar(int $baz): iFoo dans test.php sur la ligne 7
Le truc, c'est Foo est une implémentation de iFoo, donc autant que je peux dire à la mise en œuvre doit être parfaitement compatible avec l'interface donnée. Je pourrait sans doute résoudre ce problème en changeant l'interface ou la mise en œuvre de la classe (ou les deux) de rendement de l'indice de l'interface par leur nom au lieu d'utiliser self
, mais ma compréhension est que de la sémantique self
signifie "retour de l'instance de la classe que vous venez de appelé la méthode". Donc de la modifier à l'interface signifie en théorie que je retourne tout cas de quelque chose qui implémente l'interface lors de mon intention est pour le invoquée instance est ce qui va être retourné.
Est-ce un oubli dans PHP ou est-ce une volonté délibérée de décision de conception? Si c'est l'ancien est-il une chance de le voir corrigé en PHP 7.1? Si non alors quelle est la bonne manière de revenir allusion au fait que votre interface vous attend pour retourner l'instance que vous avez appelé la méthode de chaînage?