PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (1): [1]

> Найдено сообщений: 2
Bbr Отправлено: 30 Ноября, 2012 - 09:43:53 • Тема: Ищу книгу PHP рецепты программирования. 2е издание • Форум: Литература

Ответов: 2
Просмотров: 3453
Привет! Ищу книгу "PHP рецепты программирования. 2е издание"(рус) желательно в электронном виде, но если у кого то, проживающего в Киеве(желательно), завалялась в бумажном, и она ему уже не нужна, то с удовольствием заберу.
Bbr Отправлено: 21 Февраля, 2012 - 11:51:59 • Тема: Шаблон делегирования • Форум: Вопросы новичков

Ответов: 0
Просмотров: 228
Привет, разбирал примерчик с вышеуказаншой книги.
Что должен делать код:
Цитата:
В приведенном ниже примере создается экземпляр класса с именем
ClassOneDelegator, делеrирующеrо свои полномочия друrим классам. При вызове метода он в первую очередь проверяет, имеется ли такой метод в классе ClassOne. Если метод не существует, выполняется попытка отыскать этот метод в друrих, зареrистрированных у него, классах. Реrистрация объекта производится с помощью метода addObject( ). Реrистрируемые объекты включаются в список в порядке реrистрации, в этом же порядке производится поиск объекта, который может удовлетворить запрос к объекту класса ClassOneOelegator.

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php echo "<pre>";
  3. /*-----------------------------------------------------------------------*/
  4.  
  5. class ClassOne {
  6.         function callClassOne() {
  7.                 print "In Class One\n";
  8.         }
  9. }
  10.  
  11. class ClassTwo {
  12.         function callClassTwo() {
  13.                 print "In Class Two\n";
  14.         }
  15. }
  16.  
  17. class ClassOneDelegator {
  18.    private $targets;
  19.  
  20.         public function __construct()
  21.         {
  22.                 $this->target[] = new ClassOne();
  23.         }
  24.  
  25.         function addObject($obj) {
  26.                 $this->target[] = $obj;
  27.         }
  28.        
  29.         function __call($name, $args) {
  30.                 foreach ($this->target as $obj) {          // had a problem using "foreach" from example but OK  with
  31.                                                            //while(list(,$obj) = each($this->target)) {
  32.                         $r = new ReflectionClass($obj);
  33.                         if ($method = $r->getMethod($name)) {
  34.                if ($method->isPublic() && !$method->isAbstract()) {
  35.                    return $method->invoke($obj, $args);
  36.                }
  37.            }
  38.  
  39.                 }
  40.         }
  41. }
  42.  
  43. $obj = new ClassOneDelegator();
  44. $obj->addObject(new ClassTwo());
  45.  
  46. $obj->callClassOne();
  47. $obj->callClassTwo();
  48.  
  49. /*-----------------------------------------------------------------------*/
  50. echo "</pre>"; ?>
  51.  


Результат работы:
Цитата:

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)) {


Привожу пример как в книге, на сколько я понимаю, есть ошибка в
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. class ClassOneDelegator {
  3.     private $targets;
  4.  

по скольку это массив куда записываются обьекты и дальше в коде он указан без "s". Исправлял, но это не влияет на суть проблемы.

Непонятно почему не выполняется попытка отыскать вызов метода "callClassTwo()" в друrих, зареrистрированных в массиве классах.

Вобщем беда Огорчение
У меня php5.3.5, но неужели всё так сильно поменялось, чтобы не работал этот пример?
Буду благодарен за помощь в разрешение вопроса

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB