Использование ReflectionMethod :: invoke в контексте, когда оригинальный объект не находится в области видимости - PullRequest
0 голосов
/ 15 ноября 2009

Я пытаюсь сделать что-то вроде этого:

class A {
   public function foo() {
      $b = new B;
      $b->invokeMethodFromAnotherObject(new ReflectionMethod($this, 'bar'));
   }
   public function bar() {

   }
}

class B {
   public function invokeMethodFromAnotherObject(ReflectionMethod $method) {
        $method->invoke(?);
   }
}

Но нет никакого очевидного способа "высосать" это обратно из метода отражения, и у меня нет ссылки на рассматриваемый объект. Есть ли способ сделать это, не передавая $ this в B :: invokeMethodFromAnotherObject?

1 Ответ

1 голос
/ 15 ноября 2009

Методы отражения не имеют никакого понятия об объектах. Даже если вы передадите $ this «new ReflectionMethod», результирующий объект будет хранить только ссылку на класс. То, что вы хотите здесь, это на самом деле замыкание (php 5.3) или старый добрый array($this, 'bar') + call_user_func в обратном вызове.

class A {
  function foo() {
    $b = new B;
    $that = $this;
    $b->invoke(function() use($that) { $that->bar(); });
 }

 function bar() {
     echo "hi";
 }
}

class B {
 function invoke($func) {
   $func();
 }
}

$a = new A;
$a->foo();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...