J'apprends PHP et j'ai trouvé un comportement surprenant quand j'essayais de comprendre pourquoi un constructeur n'était pas appelé. Je suis habitué à Java, donc je pensais que cela produirait "Shape, Triangle." Étonnamment, il sort juste "Triangle". J'ai cherché le problème et apparemment je peux un peu le résoudre en mettant parent::__construct();
dans la classe enfant, mais cela ne semble pas idéal. Est-ce que je peux faire quelque chose à la classe Shape pour m'assurer que les classes enfant appellent toujours le constructeur parent? Dois-je vraiment écrire parent::__construct();
dans la classe de chaque enfant chaque fois que le parent a un constructeur?Puis-je forcer une classe enfant à utiliser le constructeur du parent?
Répondre
Si vous définissez une méthode du même nom dans une classe enfant, la méthode du parent est substituée et ne sera en aucun cas appelée, à moins que vous ne le fassiez explicitement. I.e .: Non, il n'y a rien que vous puissiez faire à ce sujet, vous devez appeler parent::__constructor()
explicitement.
+1 rien d'autre à ajouter. – Hamish
Vous pouvez également demander au parent de déclarer une méthode d'initialisation abstraite ou vide que le constructeur parent appelle. – erisco
@erisco Ce serait un bon modèle de conception pour contourner cela, mais cela ne change rien aux faits. :) – deceze
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.
PHP 5, vous pouvez utiliser la final keyword pour empêcher une méthode mère d'être substituée.
<?php
class BaseClass {
public function test() {
echo "BaseClass::test() called\n";
}
final public function moreTesting() {
echo "BaseClass::moreTesting() called\n";
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called\n";
}
}
// Results in Fatal error: Cannot override final method BaseClass::moreTesting()
Vous pouvez utiliser cette en combinaison avec une méthode init()
prédéfini pour assurer votre constructeur parent a été appelé.
<?php
abstract class Shape {
final function __construct() {
$this->init();
echo 'Shape.';
}
abstract public function init();
}
class Triangle extends Shape {
function init() {
echo 'Triangle';
}
}
$tri = new Triangle();
Cette génèrerait
TriangleShape.
Il est conseillé d'utiliser seulement un design comme celui-ci si vous documentez ce que la méthode init()
fait, et où il est appelé dans le parent.
- 1. Appel du constructeur de classe enfant avant le constructeur parent
- 2. Meilleure pratique: Ajouter un noeud enfant à un parent dans le constructeur enfant ou non?
- 3. Création automatique du constructeur, selon la classe parent constructeur (C++)
- 4. Créer un objet enfant dans le constructeur parent
- 5. Accéder à une classe enfant d'une autre classe enfant dans la classe parent
- 6. Implémenter une hiérarchie de classe parent-enfant
- 7. PHP: appel du constructeur enfant de la méthode statique dans le parent
- 8. Dans .NET, un constructeur 'class parent' appelle-t-il le constructeur de sa classe enfant en premier?
- 9. Comment obtenir une propriété enfant dans la classe parent?
- 10. Classe enfant Classe remplaçant la fonction virtuelle d'une classe parent
- 11. Actionscript Enfant dans le parent parent
- 12. Modélisation Hibernate parent-enfant
- 13. redimensionner le panneau enfant lors du redimensionnement du parent JFrame
- 14. OO Design: Renvoyer une classe enfant d'un parent
- 15. Comment déclarer une classe enfant en tant que propriété d'une classe parent à utiliser dans des classes enfants apparentées?
- 16. Si j'implémente ISerializable dans une classe enfant, est-ce que le parent doit aussi le faire?
- 17. Comment puis-je utiliser la classe parent pour obtenir un paramètre de la classe enfant?
- 18. Le constructeur de Superclass s'exécute-t-il dans le constructeur enfant en PHP?
- 19. Java - FlowPanel - Utiliser une variable parent d'un enfant
- 20. Remplacer le constructeur de parent d'un parent en PHP
- 21. Cours parent/enfant en C#
- 22. (c/C++) essayant de forcer EOF du processus parent envoyant l'entrée au processus enfant
- 23. C# - Fermer un formulaire enfant du parent
- 24. Clé étrangère sur une table enfant dépendante du champ parent
- 25. Vérifier à partir du constructeur si la fonction dans la classe enfant existe?
- 26. Définition de la valeur de propriété de la classe viewcontroller parent à partir du viewcontroller enfant?
- 27. Transférer un objet de parent à enfant
- 28. Scala génériques récursives: Parent [enfant] et enfant [Parent]
- 29. Appel d'une méthode de classe enfant lors du traitement d'une liste d'objets de la classe Parent
- 30. Forcer le service Web .NET à utiliser la classe d'objets locale, et non la classe proxy
Je suis assez sûr qu'il le faut, sauf si vous ne définissez pas le constructeur enfant. –
duplication possible de [Le constructeur de Superclass s'exécute-t-il dans le constructeur enfant en PHP?] (Http://stackoverflow.com/questions/738571/is-superclasss-constructor-run-inside-child-constructor-in-php) – outis