10
votes

Puis-je forcer une classe enfant à utiliser le constructeur du parent?

J'apprends PHP et j'ai trouvé un comportement surprenant lorsque j'essayais de comprendre pourquoi un constructeur n'était pas appelé. XXX

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 (); 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 (); dans la classe de chaque enfant chaque fois que le parent a un constructeur?


2 commentaires

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>


3 Réponses :


12
votes

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 () explicite.


5 commentaires

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 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 Constructeur alternatif est exécuté? Ce n'est pas une solution très évolutive. L'idiome PHP par défaut est d'utiliser parent . 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"



2
votes

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. 


0 commentaires

14
votes

AS de PHP 5, vous pouvez utiliser le Mot-clé final à Empêcher une méthode parent d'être remplacée.

TriangleShape.


0 commentaires