62 votes

Les constructeurs de classes abstraites ne sont-ils pas appelés implicitement lorsqu'une classe dérivée est instanciée?

Prenons cet exemple:

 abstract class Base {
    function __construct() {
        echo 'Base __construct<br/>';
    }
}

class Child extends Base {
    function __construct() {
        echo 'Child __construct<br/>';
    }
}

$c = new Child();   
 

Venant d’un arrière-plan C #, j’espère que la sortie sera

Base __construct
Enfant __construit

Cependant, la sortie réelle est juste

Enfant __construit

104voto

Pascal MARTIN Points 195780

Non, le constructeur de la classe parent n'est pas appelée si l'enfant de la classe définit un constructeur.

À partir du constructeur de votre enfant de la classe, vous devez appeler le constructeur de la classe du parent :

parent::__construct();

En lui passant les paramètres, si nécessaire.

Généralement, vous allez le faire au début de l'constructeur de la classe fille, avant tout code spécifique ; ce qui signifie, dans votre cas, vous devez :

class Child extends Base {
    function __construct() {
        parent::__construct();
        echo 'Child __construct<br/>';
    }
}


Et, pour référence, vous pouvez prendre un coup d'oeil à cette page du manuel PHP : les Constructeurs et Destructeurs -- c'unis (en les citant) :

Remarque: Parent les constructeurs ne sont pas appelé implicitement que si la classe enfant définit un constructeur.
Afin de exécuter un constructeur parent, un appel à parent::__construct() dans le enfant du constructeur est nécessaire.

6voto

scottm Points 13578

Eh bien, je viens de trouver ceci dans la documentation :

Remarque: Les constructeurs parents ne sont pas appelés implicitement si la classe enfant définit un constructeur. Pour exécuter un constructeur parent, un appel à parent :: __ construct () dans le constructeur enfant est requis.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X