что я пытаюсь сделать, это вызвать каждый метод "init" от родителей текущего класса.
Я делаю это, чтобы программистам не приходилось вызывать метод init (parent :: init ())каждый раз, когда они создают метод init в новом контроллере.
Пример:
class Aspic\Controller { } // main controller
class ControllerA extends Aspic\Controller { public function init() {/* do something 1 */}
class ControllerB extends ControllerA {}
class ControllerC extends ControllerB { public function init() { /* do something 2 */ }
class ControllerD extends ControllerC {}
Как видите, методы init
не вызывают метод parent init
, но я хочу, чтобы мой методприложение (есть опция) сделать это.
Таким образом, когда я загружаю ControllerD
, прежде чем вызывать его метод init
(нет в примере, но приложение тестирует его), я хочудля вызова каждого родительского init
метода.
звучит так:
parent::init(); // Controller C init
parent::parent::parent::init(); // Controller A init
Итак, я сделал:
if($this->_autoCallParentsInit) {
// Aspic\Controller is the main controller, which is the mother of all others
$aspicControllerRc = new \ReflectionClass('Aspic\\Controller');
$rc = new \ReflectionClass($this); // We are in D
$currPrefix = '';
// Calling each init methods of current class parent
// Avoid using parent::init() in each controller
while(($parentClass = $rc->getParentClass()) AND $aspicControllerRc->isInstance($parentClass)) {
/*
$aspicControllerRc->isInstance($parentClass)
=> because Aspic\Controller extends a "Base class". Thus, we stopped at Aspic\Controller
*/
$currPrefix .= 'parent::';
// Must have explicit method (not inherited from parent) BUT actually hasMethod does not care
if($parentClass->hasMethod('init')) {
call_user_func($currPrefix.'init');
}
}
}
Это не работает, потому что ReflectionClass::isInstance
делаетне принимать аргумент, отличный от объекта, который мы хотим проверить (и не объект ReflectionClass
, представляющий его, как в примере)
** Просто: у меня есть объект $ x, и я хочу вызватьinit
метод каждого родителя класса $ x.**
Возможно ли это?
Надеюсь, я понял:)
Спасибо