За последние 24 часа нас посетили 30485 программистов и 1790 роботов. Сейчас ищут 1132 программиста ...

ReflectionException

Тема в разделе "Прочие вопросы по PHP", создана пользователем al.k, 4 мар 2010.

  1. al.k

    al.k Активный пользователь

    С нами с:
    4 мар 2010
    Сообщения:
    70
    Симпатии:
    0
    Адрес:
    UKR, Lugansk
    Есть такой код, реализация делегирования через рефлексию

    Код (Text):
    1.  
    2.  
    3. <?php
    4.  
    5. class Foo {
    6.     public function foo()
    7.     {
    8.         return __METHOD__;
    9.     }
    10. }
    11.  
    12. class Bar {
    13.     public function bar()
    14.     {
    15.         return __METHOD__;
    16.     }
    17. }
    18.  
    19. class Delegator {
    20.     private $registeredObjects;
    21.  
    22.     public function addObject($o)
    23.     {
    24.         $this->registeredObjects[] = $o;
    25.         return null;
    26.     }
    27.  
    28.     public function __call($method, $args)
    29.     {
    30.         foreach ($this->registeredObjects as $o) {
    31.             $c = new ReflectionClass($o);
    32.             if ($m = $c->getMethod($method))
    33.                {
    34.                 if ($m->isPublic() && !$m->isAbstract()) {
    35.                     return $m->invoke($o, $args);
    36.                 }
    37.             }
    38.         }
    39.     }
    40. }
    41.  
    42.  
    43.  
    44. $delegator = new Delegator;
    45.  
    46. $delegator->addObject(new Foo);
    47. $delegator->addObject(new Bar);
    48.  
    49. print $delegator->foo();
    50. print $delegator->bar();
    51. ?>
    Второй вызов делегатора заканчивается эксепшином следующего содержания

    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

    Вопрос почему?
     
  2. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Что в теории возвращает getMethod?
     
  3. потому что метода bar() у обьекта foo нет, но ты пытаешься сделать ему getMethod()
    сначала нужно проверить его существование через hasMethod()
    либо обработать исключение.
     
  4. al.k

    al.k Активный пользователь

    С нами с:
    4 мар 2010
    Сообщения:
    70
    Симпатии:
    0
    Адрес:
    UKR, Lugansk
    объект типа ReflectionMethod....кажется так
     
  5. al.k

    al.k Активный пользователь

    С нами с:
    4 мар 2010
    Сообщения:
    70
    Симпатии:
    0
    Адрес:
    UKR, Lugansk
    Код не мой, взял здесь http://subscribe.ru/archive/inet.webbuild.php5whatsnew/200604/28211722.html. По-моему, то что вы советуете, то что надо, щас попробую....
    А как можно обработать исключение, подскажите...По-моему они не обрабатываются.
     
  6. исключения как раз и придуманы, что бы их обрабатывать. Исключение сообщает, что произошла исключительная ситуация - еще не ошибка. Но если исключение не обработать - оно будет ошибкой

    подробней о механизме исключений: http://php.net/exceptions

    в твоем случае будет что то вроде
    PHP:
    1. <?php
    2. ...
    3. $c = new ReflectionClass($o);
    4. try {
    5.             $m = $c->getMethod($method)
    6.                 if ($m->isPublic() && !$m->isAbstract()) {
    7.                     return $m->invoke($o, $args);
    8.                 }
    9.       } catch (ReflectionException $e) {
    10.      echo "Вызов несуществующего метода: ";
    11.      var_dump($e);
    12. }
     
  7. al.k

    al.k Активный пользователь

    С нами с:
    4 мар 2010
    Сообщения:
    70
    Симпатии:
    0
    Адрес:
    UKR, Lugansk
    Спасибо, все понял..