Есть такой код, реализация делегирования через рефлексию Код (Text): <?php class Foo { public function foo() { return __METHOD__; } } class Bar { public function bar() { return __METHOD__; } } class Delegator { private $registeredObjects; public function addObject($o) { $this->registeredObjects[] = $o; return null; } public function __call($method, $args) { foreach ($this->registeredObjects as $o) { $c = new ReflectionClass($o); if ($m = $c->getMethod($method)) { if ($m->isPublic() && !$m->isAbstract()) { return $m->invoke($o, $args); } } } } } $delegator = new Delegator; $delegator->addObject(new Foo); $delegator->addObject(new Bar); print $delegator->foo(); print $delegator->bar(); ?> Второй вызов делегатора заканчивается эксепшином следующего содержания Fatal error: Uncaught exception 'ReflectionException' with message 'Method bar does not exist' in D:\path\to\folder\test.php:30 Stack trace: #0 D:\path\to\folder\test.php(30): ReflectionClass->getMethod('bar') #1 [internal function]: Delegator->__call('bar', Array) #2 D:\path\to\folder\test.php(47): Delegator->bar() #3 {main} thrown in D:\path\to\folder\test.php on line 30 Вопрос почему?
потому что метода bar() у обьекта foo нет, но ты пытаешься сделать ему getMethod() сначала нужно проверить его существование через hasMethod() либо обработать исключение.
Код не мой, взял здесь http://subscribe.ru/archive/inet.webbuild.php5whatsnew/200604/28211722.html. По-моему, то что вы советуете, то что надо, щас попробую.... А как можно обработать исключение, подскажите...По-моему они не обрабатываются.
исключения как раз и придуманы, что бы их обрабатывать. Исключение сообщает, что произошла исключительная ситуация - еще не ошибка. Но если исключение не обработать - оно будет ошибкой подробней о механизме исключений: http://php.net/exceptions в твоем случае будет что то вроде PHP: <?php ... $c = new ReflectionClass($o); try { $m = $c->getMethod($method) if ($m->isPublic() && !$m->isAbstract()) { return $m->invoke($o, $args); } } catch (ReflectionException $e) { echo "Вызов несуществующего метода: "; var_dump($e); }