J'apprends PHP et j'ai trouvé un comportement surprenant lorsque j'essayais de comprendre pourquoi un constructeur n'était pas appelé. Je suis habitué à Java, alors je pensais Cela produirait "la forme. Triangle". Étonnamment, il génère simplement "Triangle". J'ai cherché le problème et apparemment, je peux un peu Sorta la corrige en mettant parent :: __ construire (); code> dans la classe enfant, mais cela ne semble pas idéal. Y a-t-il quelque chose que je puisse faire à la classe de forme pour vous assurer que les classes d'enfants appellent toujours le constructeur de parents? Dois-je vraiment écrire parent :: __ construire (); code> dans la classe de chaque enfant chaque fois que le parent a un constructeur? P> p>
3 Réponses :
Si vous définissez une méthode du même nom dans une classe enfant, la méthode du parent est remplacée et ne sera appelée en aucune circonstance, sauf si vous le faites explicitement. I.e.: Non, il n'y a rien que vous puissiez faire à ce sujet, vous devez appeler parent :: __ construction () code> explicite. P>
Vous pouvez également avoir le parent déclarer une méthode d'initialisation abstraite ou vide que le constructeur parent appelle.
@erisco qui serait un bon modèle de design pour travailler autour de cela, mais cela ne change pas les faits. :)
@Deceze La question initiale demande à l'émulation d'un comportement spécifique ... qui peut en fait être imitée.
@MirRored, je ne dirais pas qu'à utiliser final code> et désignant une autre méthode car le constructeur est une excellente alternative. Et si vous souhaitez étendre la classe extension et vous assurer que SON i> Constructeur alternatif est exécuté? Ce n'est pas une solution très évolutive. L'idiome PHP par défaut est d'utiliser parent code>. C'est la décision et la responsabilité de chaque développeur de le faire.
@Deceze Je ne dirais pas que c'est une "excellente" alternative, non plus et probablement pas approprié pour la plupart des situations. Mais il est incorrect de dire "il n'y a rien que vous puissiez faire à ce sujet"
Selon le manuel PHP:
Parent constructors are not called implicitly if the child class defines a constructor. In order to run a parent constructor, a call to parent::__construct() within the child constructor is required.
AS de PHP 5, vous pouvez utiliser le Mot-clé final à Empêcher une méthode parent d'être remplacée.
TriangleShape.
Je suis à peu près sûr que vous devez, à moins que vous ne définissiez pas le constructeur enfant.
Dupliqué possible de Le constructeur de SuperClass est exécuté à l'intérieur de l'enfant constructeur en PHP? < / a>