У меня есть этот код:
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()
– это гораздо лучший дизайн.