PHP手册说明
在
5.4.0之前,不能使用匿名函数中的
$this
在anonymous functions page上。但我发现,我可以通过将$this
赋给一个变量并将该变量传递给函数定义处的use
语句来使其工作。
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
这是一个好的实践吗?
有没有更好的方式使用PHP5.3在匿名函数中访问$this
?
发布于 2011-12-06 04:10:51
当您尝试调用它的受保护或私有方法时,它将失败,因为以这种方式使用它将被视为从外部调用。据我所知,在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指向的内容:
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,其中第一个参数可用于指定$this指向的内容,第二个参数控制可见性级别应为。如果你省略了第二个参数,可见性就像从“外部”调用一样,例如。只能访问公共属性。还要注意bindTo的工作方式,它不会修改原始函数,而是返回一个新的。
发布于 2012-02-18 20:38:41
不要总是依赖PHP通过引用来传递对象,当您为引用本身赋值时,其行为与大多数OO语言中修改原始指针的行为不同。
您的示例:
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
应该是:
$CI = $this;
$callback = function () use (&$CI) {
$CI->public_method();
};
注意,引用"&“和$CI应该在最终调用它之后赋值,否则你可能会有不可预测的输出,在PHP中访问引用并不总是与访问原始类相同-如果这是有意义的话。
发布于 2011-12-06 04:06:44
这是正常的方式。
b.t.w,试着删除&
,它应该在没有这个的情况下工作,因为对象是以任何方式通过引用传递的。
https://stackoverflow.com/questions/8391099
复制相似问题