0 votes

Utilisation de ReflectionMethod::invoke dans un contexte où l'objet d'origine n'est pas dans le champ d'application (scope)

J'essaie de faire quelque chose comme ça :

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(?);
   }
}

Mais il n'y a aucun moyen apparent d'"aspirer" $this hors de la méthode de réflexion, et je n'ai pas de référence à l'objet en question. Existe-t-il un moyen de faire cela sans passer $this dans B::invokeMethodFromAnotherObject ?

1voto

user187291 Points 28951

Les méthodes de réflexion n'ont aucune idée des objets. Même si vous passez $this à la "nouvelle méthode Reflection", l'objet résultant ne stocke qu'une référence de classe. Ce que vous voulez ici, c'est en fait une fermeture (php 5.3) ou la bonne vieille méthode array($this, 'bar') + call_user_func dans le rappel.

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();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X