Привет, разбирал примерчик с вышеуказаншой книги.
Что должен делать код:
Цитата:В приведенном ниже примере создается экземпляр класса с именем
ClassOneDelegator, делеrирующеrо свои полномочия друrим классам. При вызове метода он в первую очередь проверяет, имеется ли такой метод в классе ClassOne. Если метод не существует, выполняется попытка отыскать этот метод в друrих, зареrистрированных у него, классах. Реrистрация объекта производится с помощью метода addObject( ). Реrистрируемые объекты включаются в список в порядке реrистрации, в этом же порядке производится поиск объекта, который может удовлетворить запрос к объекту класса ClassOneOelegator.
CODE ( htmlphp):
скопировать код в буфер обмена
<?php echo "<pre>"; /*-----------------------------------------------------------------------*/ class ClassOne { function callClassOne() { print "In Class One\n"; } } class ClassTwo { function callClassTwo() { print "In Class Two\n"; } } class ClassOneDelegator { private $targets; public function __construct() { $this->target[] = new ClassOne(); } function addObject($obj) { $this->target[] = $obj; } function __call($name, $args) { foreach ($this->target as $obj) { // had a problem using "foreach" from example but OK with //while(list(,$obj) = each($this->target)) { $r = new ReflectionClass($obj); if ($method = $r->getMethod($name)) { if ($method->isPublic() && !$method->isAbstract()) { return $method->invoke($obj, $args); } } } } } $obj = new ClassOneDelegator(); $obj->addObject(new ClassTwo()); $obj->callClassOne(); $obj->callClassTwo(); /*-----------------------------------------------------------------------*/ echo "</pre>"; ?>
Результат работы:
Цитата:
In Class One
Fatal error: Uncaught exception 'ReflectionException' with message 'Method callClassTwo does not exist' in D:\SITES\test\www\g_test\delegate_template.php:32
Stack trace:
#0 D:\SITES\test\www\g_test\delegate_template.php(32): ReflectionClass->getMethod('callClassTwo')
#1 D:\SITES\test\www\g_test\delegate_template.php(46): ClassOneDelegator->__call('callClassTwo', Array)
#2 D:\SITES\test\www\g_test\delegate_template.php(46): ClassOneDelegator->callClassTwo()
#3 {main}
thrown in D:\SITES\test\www\g_test\delegate_template.php on line 32
32 строка это:
Цитата:if ($method = $r->getMethod($name)) {
Привожу пример как в книге, на сколько я понимаю, есть ошибка в
по скольку это массив куда записываются обьекты и дальше в коде он указан без "s". Исправлял, но это не влияет на суть проблемы.
Непонятно почему не выполняется попытка отыскать вызов метода "callClassTwo()" в друrих, зареrистрированных в массиве классах.
Вобщем беда
У меня php5.3.5, но неужели всё так сильно поменялось, чтобы не работал этот пример?
Буду благодарен за помощь в разрешение вопроса(Отредактировано автором: 21 Февраля, 2012 - 11:59:30)
|