4 votes

Appeler le constructeur à l'intérieur d'une méthode

D'une manière ou d'une autre, mon esprit s'est éloigné du problème actuel et j'ai commis une terrible erreur.. J'ai appelé un constructeur parent à l'intérieur d'une méthode qui initialise simplement les propriétés de classes.. Ou ai-je.. Le rôle du constructeur parent était de définir la valeur de l'ID. Eh bien PHP m'a permis de le faire. Mais n'est-ce pas juste faux ? Et on dirait que je peux appeler le constructeur de la classe de la même manière.. N'est-ce pas que les constructeurs ne devraient être autorisés à être appelés que lors de la création d'instances d'une classe... Et ils ne sont appelés que lors de la création d'instances..

";
        }

    }

    class B extends A {

        public function test() {
            parent::__construct();
        }

    }

    $b = new B();
    $b->test();

    // OUTPUT:
    // Test
    // Test

?>

EDIT: Donc la conclusion est que PHP vous permet d'appeler le constructeur à l'intérieur d'une méthode mais en réalité cela ne fait rien. Et cette autre chaîne "TEST" vient du constructeur de la classe de base.

3voto

RobertPitt Points 28140

Un mot décrit exactement la situation.

Remplacer

Ce qui se passe, c'est que lorsque le parent a une méthode comme un __construct et que la classe enfant n'a pas cette méthode, lorsque la méthode est appelée sur la classe enfant, elle appelle la méthode du parent.

Par exemple :

class Parent
{
     public function start(){}
}
class Child extends Parent
{

}

si j'appelle la méthode start sur la classe Child, elle exécute le Parent::Start(), mais si la classe Child a une méthode appelée Start(), celle-ci serait appelée car elle remplace la version du parent.

Chaque classe a une méthode constructeur, et php exécute cela pour compiler la classe en un objet, maintenant si vous avez une méthode appelée __construct() dans une classe, PHP appelle le constructeur interne qui compile la classe, puis appelle votre constructeur de remplacement.

Si vous n'avez pas de méthode __construct dans la classe enfant, PHP exécute le __construct du parent

C'est la raison pour laquelle vous obtenez 2 x Test dans votre initialisation d'objet.

La seule fois où vous devriez utiliser parent:__cosntruct() est si votre classe enfant nécessite un constructeur défini par l'utilisateur, vous appelez explicitement le constructeur parent pour préparer l'objet parent.

Par exemple :

class Parent
{
     public function __construct()
     {
         //Faire des travaux sur la classe Parent
     }
}

class Child extends Parent
{
    public function __construct()
    {
         //Faire des travaux sur la classe enfant

         parent::__construct();
    }
}

La raison pour laquelle vous ne devriez jamais appeler un constructeur parent dans une méthode enfant et non une méthode enfant est que les constructeurs ne doivent être appelés qu'une seule fois, de cette façon cela est renforcé.

1voto

Vous n'appelez pas un constructeur parent à des moments arbitraires. Vous appelez un constructeur parent uniquement à partir d'un constructeur enfant, c'est-à-dire pendant que l'objet est en cours de construction.

Si php le permet autrement, alors c'est simplement un artefact de la façon dont les classes sont implémentées dans le langage, et ne doit pas être interprété comme signifiant que c'est une bonne chose à faire.

0voto

vbence Points 10528

Ce n'est pas une bonne pratique, et les langages OOP bien conçus ne vous permettent généralement pas de le faire. Bien que ce soit tout à fait correct si vous savez exactement ce que vous faites. (Et vous pouvez documenter cela pour que d'autres programmeurs travaillant avec ce code comprennent votre concept).

0voto

Nick Clark Points 2343

Je suggérerais d'utiliser une méthode "init" pour gérer ce type de comportement. Voici un exemple :

class A {
    public function __construct() {
        $this->init();
    }
    protected function init() {
        echo "Test";
    }
}

class B extends A {
    public function __construct() {
        // supprimer le constructeur parent
    }
    public function test() {
        $this->init();
    }
}

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