Как вызвать конструктор родительских классов с его исходными параметрами в PHP

У меня есть этот код:

class A { var $arr = array(); function __construct($para) { echo 'Not called'; } } class B extends A { function __construct() { $arr[] = 'new Item'; } } 

И так как B имеет свою конструкцию конструктора ($ para) A, никогда не будет вызвана.

Теперь я мог бы вызвать parent :: __ construct ($ para), но тогда класс B должен был знать о параметрах класса A.

Я бы предпочел это:

 class A { var $arr = array(); function __construct($para) { echo 'Not called'; } } class B extends A { function __construct() { parent::__construct(); // With the parameters class B was created. // Additional actions that do not need direct access to the parameters $arr[] = 'new Item'; } } 

Будет что-то подобное?

Мне не нравится тот факт, что все классы, которые расширяют класс A, должны будут определить новый конструктор, как только класс A изменит его параметры, где все, что я хочу сделать, это вызвать конструктор класса A, например, когда класс B не перезапишите его собственным методом __construct ().

Одним из решений было бы не переопределять родительский конструктор в первую очередь. Вместо этого определите отдельный (первоначально пустой init() метод init() который родительский конструктор вызывает автоматически. Этот метод затем может быть перезаписан для ребенка, чтобы выполнить дополнительную обработку.

 class A { public function __construct($para) { // parent processing using $para values // ..and then run any extra child initialization $this->init(); } protected function init() { } } class B extends A { protected function init() { // Additional actions that do not need direct access to the parameters } } 

Существует способ сделать это почти так же, как вы изначально описали его, используя функции call_user_func_array() и func_get_args() :

 class B extends A { function __construct() { // call the parent constructor with whatever parameters were provided call_user_func_array(array('parent', '__construct'), func_get_args()); // Additional actions that do not need direct access to the parameters $arr[] = 'new Item'; } } 

Хотя это делает интересное упражнение, я лично не рекомендую использовать его на самом деле – я думаю, что использование отдельного метода init() – это гораздо лучший дизайн.