ste*_*red 85 php anonymous-function
PHP手册说明
$this在PHP 5.4.0之前无法使用匿名函数
在匿名功能页面上.但我发现我可以通过赋值$this给变量并将变量传递给use函数定义中的语句来使其工作.
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
Run Code Online (Sandbox Code Playgroud)
这是一个好习惯吗?
有没有更好的方法来$this使用PHP 5.3 访问匿名函数?
K. *_*ert 66
当您尝试在其上调用受保护或私有方法时,它将失败,因为使用它会被视为从外部调用.据我所知,在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"
Run Code Online (Sandbox Code Playgroud)
更重要的是,你可以在运行时更改$ 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"
Run Code Online (Sandbox Code Playgroud)
实际上,anonymus函数将具有bindTo()方法,其中第一个参数可用于指定$ this指向的内容,第二个参数控制可见性级别应该是什么.如果省略第二个参数,则可见性就像从"外部"调用,例如.只能访问公共属性.还要注意bindTo的工作方式,它不会修改原始函数,而是返回一个新函数.
小智 6
不要总是依赖PHP来通过引用传递对象,当您自己分配引用时,行为与修改原始指针的大多数OO语言中的行为不同.
你的例子:
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
Run Code Online (Sandbox Code Playgroud)
应该:
$CI = $this;
$callback = function () use (&$CI) {
$CI->public_method();
};
Run Code Online (Sandbox Code Playgroud)
注意参考"&"和$ CI应该在完成最后一次调用之后分配,否则你可能会有不可预测的输出,在PHP中访问引用并不总是与访问原始类相同 - 如果这是有道理的.
http://php.net/manual/en/language.references.pass.php