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


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
Auteur

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.

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