PHP手册说明
anonymous functions page上的在PHP之前无法使用匿名函数中的
$this
5.4.0
。但我发现我可以通过将$this
赋给变量并将变量传递给函数定义中的use
语句来使其工作。
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
这是一个好习惯吗?
有没有更好的方法来使用PHP 5.3访问匿名函数中的$this
?
答案 0 :(得分:65)
当您尝试在其上调用受保护或私有方法时,它将失败,因为以这种方式使用它会被视为从外部调用。据我所知,在5.3中没有办法解决这个问题,但是在PHP 5.4中,它将按预期工作,开箱即用:
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter(); // outputs "Hello world"
更多的是,你可以在运行时更改$ this指向anonymus函数(闭包重新绑定):
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
class Bye {
private $message = "Bye world\n";
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$bye = new Bye();
$byePrinter = $helloPrinter->bindTo($bye, $bye);
$byePrinter(); // outputs "Bye world"
实际上,匿名函数将具有bindTo() method,其中第一个参数可用于指定$指向的内容,第二个参数控制可见性级别。如果省略第二个参数,则可见性就像从“外部”调用,例如。只能访问公共属性。另请注意bindTo的工作方式,它不会修改原始函数,会返回一个新函数。
答案 1 :(得分:6)
不要总是依赖PHP通过引用传递对象,当您自己分配引用时,行为与修改原始指针的大多数OO语言中的行为不同。
你的例子:
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
应该是:
$CI = $this;
$callback = function () use (&$CI) {
$CI->public_method();
};
注意参考“&”在完成最后一次调用之后应该分配$ CI,否则你可能会有不可预测的输出,在访问引用的PHP中并不总是与访问原始类相同 - 如果这是有道理的。
答案 2 :(得分:5)
这是正常的做法
b.t.w,尝试删除&
它应该没有这个,因为对象以任何方式通过ref。
答案 3 :(得分:1)
如果您通过引用传递它是正确的方法,那似乎没问题。如果您使用PHP 5,则&
之前不需要$this
符号,因为无论如何它总是通过引用传递。
答案 4 :(得分:1)
这很好。我认为你也可以这样做:
$CI = $this;
...因为涉及对象的赋值将始终复制引用,而不是整个对象。