在回调匿名函数中访问类的实例
问题描述:
我有一个类,有几个方法将一个匿名函数作为参数。这个类看起来是这样的:在回调匿名函数中访问类的实例
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();
输出:
我可以看到我自己的私处!
感谢您的回复。如果我想让班级公开可用,并尽可能减少班级以外需要完成的任务,该怎么办?我可以在课堂上处理'使用'情况吗? – mast 2014-09-05 20:26:13
我不知道我真的理解你的评论,你问你是否把这个功能放在一个类中,你也可以在'$ self'对象上调用private/protected方法吗? – 2014-09-05 20:41:55