Initialiser automatiquement la class parent

Par Eric237, il y a 4 ans


Bonjour tous le monde, voila la situation:

<?php namespace App; class BaseClass { public $app;     function __construct() {         $this->app = App::$app;     } } ?> <?php namespace App; class Enfant1 extends BaseClass { public $enfant_app;     function __construct() {         parent::__construct(); $this->enfant_app = $this->$app->getData();     } } ?> <?php namespace App; class Enfant2 extends Enfant1 { public $enfant_2_app;     function __construct() {         parent::__construct();     } } ?>

Ce que je veux

Dans tous les controllers enfants je dois faire parent::__construct(); pour avoir acces aux proprietes parents. J'aimerais savoir s'il y'a un autre moyen de le faire (ne pas faire parent::__construct();dans tous mes classes enfants).

Les class sont instanciés dynamiquement dans nom code, par exemple

<?php $class_name = 'Enfant1'; $method_name = 'convertData'; $class = new $class_name(); $argc = array_values($params); call_user_func_array([$class, $method_name], $argc); ?>

N'est il pas possible d'initialiser le constructeur parent hors de la class enfant, du genre

<?php $class_name = 'Enfant1'; $method_name = 'convertData'; $class = new $class_name(); /********************************************************** get_parent_class($class)->__construct() // Juste un exemple get_parent_class($class)::__construct() // Juste un exemple ***********************************************************/ $argc = array_values($params); call_user_func_array([$class, $method_name], $argc); ?>

Merci pour votre aide.

3 réponses

popotte, il y a 4 ans

Hello, alors non si tu veux surcharger pour y ajouter $this->enfant_app = $this->$app->getData(); ta classe tu es obligé de faire un parent::construct();, et ce n'est pas un hack c'est une façon totalement legit de faire ;)

Ah au fait, ta class Enfant2 ne fait que un parent::construct(); sans rien surcharger, tu peux retirer la function public function __construct() {...} de ta classe Enfant2, le construct du parent sera automatiquement appelé si ta classe enfant ne possède pas de function construct :p

Eric237, il y a 4 ans

Salut, merci deja pour ta reponse.
Oui je sais bien que c'est normal de faire parent::construct(); mais je me demandais s'il y'a pas un moyen de le faire dynamiquement vu que mes class sont instanciés dynamiquement. En fait dans le code toutes les class sont extends soit de BaseClass ou d'une class Enfant qui elle extends de BaseClass.

popotte, il y a 4 ans

Ah okay, mmmh peut être en faisant comme ça:

<?php $class_name = 'Enfant1'; $method_name = 'convertData'; $class = new $class_name(); $class->initChild(); // $this->enfant_app = $this->app->getData(); $argc = array_values($params); call_user_func_array([$class, $method_name], $argc);

Et dans la class parent:

<?php namespace App; class BaseClass { public $app; public $enfant_app; public function __construct() { $this->app = App::$app; } public function initChild() { $this->enfant_app = $this->app->getData(); } }

Et dans les class enfants tu retires la function __construct

C'est pas idéal comme méthode (placer une fonction enfant dans le parent) mais au moins c'est plus dynamique :p