在回调匿名函数中访问类的实例

问题描述:

我有一个类,有几个方法将一个匿名函数作为参数。这个类看起来是这样的:在回调匿名函数中访问类的实例

class MyClass { 
    public function myMethod($param, $func) { 
      echo $param; 
      user_call_func($func); 
    } 


    public function sayHello() { 
     echo "Hello from MyClass"; 
    } 
} 

我希望能够做这样的事情:

$obj = new MyClass; 
$obj->myMethod("Hi", function($obj) { 
    echo "I'm in this anonymous function"; 
    // let's use a method from myClass 
    $obj->sayHello(); 
}); 

所以,在我的匿名函数,因为我通过$ OBJ作为参数传递给匿名函数,我应该能够从匿名函数中访问它的方法。在这种情况下,我们会看到

I'm in this anonymous function 
Hello from MyClass 

我该如何实现这一目标?

感谢

使用use结构:

$self = $this; 
$obj->myMethod("Hi", function($obj) use($self) { 
    echo "I'm in this anonymous function"; 
    // let's use a method from myClass 
    $obj->sayHello(); 
}); 

你必须捕捉$this另一个变量,因为use不允许$this,除非你正在使用PHP被传入,> = 5.4。 documentation的相关报价:

闭包也可能继承父范围的变量。任何这样的 变量必须传递给use语言结构。从父范围继承 变量与使用全局变量 不同。全局变量存在于全局范围内,无论执行什么功能,全局变量都是相同的。封闭函数的父范围是声明闭包函数的函数(不是必须是函数调用的函数)。

更新

这也可能是让你知道,你保留你当匿名函数在执行当前所在班级的知名度,在这个简单的脚本证明:

class Test 
{ 
    public function testMe() 
    { 
     $self = $this; 
     $tester = function() use($self) { 
      $self->iAmPrivate(); 
     }; 

     $tester(); 
    } 

    private function iAmPrivate() 
    { 
     echo 'I can see my own private parts!'; 
    } 
} 

$test = new Test; 
$test->testMe(); 

输出:

我可以看到我自己的私处!

+0

感谢您的回复。如果我想让班级公开可用,并尽可能减少班级以外需要完成的任务,该怎么办?我可以在课堂上处理'使用'情况吗? – mast 2014-09-05 20:26:13

+0

我不知道我真的理解你的评论,你问你是否把这个功能放在一个类中,你也可以在'$ self'对象上调用private/protected方法吗? – 2014-09-05 20:41:55