Вызвать конструктор предка с теми-же аргументами

ksnk

прохожий
Вызвать конструктор предка с теми-же аргументами

Есть класс, получающий неопределенное количество аргументов и умеющий с ними работать с помощью функции func_get_args. Требуется написать класс-наследник со своей логикой в конструкторе, но с таким-же неопределенным количеством аргументов.

Состряпался такой вот перл, но, понятно, php отказался его исполнять...
PHP:
	function __construct(){
		$arg=func_get_args();
		call_user_func_array(array($this,parent::__construct),$arg);
                //...
	}
Как его нужно было вызвать?
А это вообще - возможно?
Вариант "передавать один параметр-массив и парится с ним дальше" не интересен, так как требует правок в уже живом коде...
 

crocodile2u

http://vbolshov.org.ru
ksnk

Это не очень хороший подход.

И, хотя ты можешь использовать такую конструкцию:

call_user_func_array(array('parent', '__construct'),$arg);

- это плохое решение, поскольку
а) генерит ошибку уровня E_STRICT
б) (и это, наверное, главное) является архитектурно плохим: непонятно, кто же в результате использует какой аргумент - родитель или потомок
 

ksnk

прохожий
Это не очень хороший подход.
пока мне кажется, что это менее плохое решение, чем изменять код во всех зависимых проектах ;-) Впрочем - поживем, посмотрим...

Спасибо, заработало!
 

zerkms

TDD infected
Команда форума
crocodile2u
"шаблонный метод" противопоставлять "переопределению конструктора"..... хзхз
 

crocodile2u

http://vbolshov.org.ru
zerkms
В данном случае может пригодиться. Пример:

PHP:
<?php
class A {
     final function __construct()
    {
         $arg=func_get_args();
         // some code
         call_user_func_array(array($this, 'setup'),$arg);
    }
    protected function setup() {}
}
class B extends A {
    protected function setup($a1, $a2,..) {
        // do something here
    }
}
?>
 

rotoZOOM

ACM maniac
изменять код во всех зависимых проектах
Как всегда встает дилемма, либо поддерживать и развивать текущий гавнокод, создавая не менее гавнокодистый код ибо "а как?", либо потратить время на рефакторинг. Вряд ли за тебя кто-то это решит.
 

ksnk

прохожий
crocodile2u
А чем такой подход принципиально лучше?
В моем случае весь массив параметров должен обработать класс-предок. Наследнику параметры не нужны.
Так что метод setup класса B должен точно так-же оттранслировать весь поток параметров в setup родителя. Точно такой-же E_STRICT- опасной конструкцией :)
 

crocodile2u

http://vbolshov.org.ru
ksnk
О! Я почему-то так и думал. Именно в этой ситуации лучше воспользоваться шаблонным методом. Только ты, видимо, не вник в код, который я написал.

Поясню. А так же немного видоизменю код с учетом сказанного. К тому же код, таким образом, станет гораздо красивее и читабельнее.

PHP:
<?php 
class A { 
     final function __construct() 
    { 
        // здесь мы считали наши аргументы, проделали с ними все, что нужно
         $arg=func_get_args(); 
        //...
        // а вот здесь начинается магия наследования.
        // если вызвать new A(); - вызовется метод A->setup()
        // если же вызвать new B(); - вызовется метод B->setup() - который может переопределять
        // метод родителя!
        $this->setup();
    } 
    // умолчательный сетуп - ничего не делаем
    protected function setup() {} 
}
class B extends A { 
    protected function setup() { 
        echo __METHOD__."\n";
    } 
}
?>
Надеюсь, теперь ситуация стала яснее.

-~{}~ 23.05.08 10:24:

ksnk
Так что метод setup класса B должен точно так-же оттранслировать весь поток параметров в setup родителя. Точно такой-же E_STRICT- опасной конструкцией :)
Еще раз повторю: ты не понял код, который я привел, читай разъяснения, а по поводу E_STRICT - тоже постарайся разобраться, мой вариант не содержит ошибок.
 
Сверху