我有一个带有一些方法的类,它们将匿名函数作为参数。该课程如下:
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
我将如何实现这一目标?
由于
答案 0 :(得分:4)
使用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
语言构造。继承 父作用域中的变量与使用全局不同 变量。全局变量存在于全局范围内,即 无论执行什么功能都一样。 a的父范围 闭包是声明闭包的功能(不是 必然是从中调用它的功能。
<强>更新强>
如匿名函数执行时,知道您保留当前所在类的可见性也可能会有所帮助,如此简单脚本所示:
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();
输出:
我可以看到自己的私人部分!