在匿名函数中使用$ this
PHP手册说明
在PHP 5.4.0之前,不能使用匿名函数中的
$this
在匿名函数页面上 。 但是我发现我可以通过将$ this分配给一个引用并将该引用传递给函数定义中的一个use
语句来使其工作。
$CI = $this; $callback = function () use ($CI) { $CI->public_method(); };
这是一个很好的做法,是否有一个更好的方法来访问使用PHP 5.3的匿名函数$ this?
编辑:删除由ref字符分配&
因为对象被默认在PHP分配ref。 $CI = &$this
变为$CI = $this
当你尝试调用一个受保护的或私有的方法时,它会失败,因为使用它从外部调用。 据我所知,在5.3中没有办法解决这个问题,但是PHP5.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"
更重要的是,您可以在运行时更改$这个指向匿名函数(closures重新绑定):
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"
有效地,anonymus函数将有一个bindTo()方法 ,其中第一个参数可用于指定$指向哪个元素,第二个参数控制可见性级别 。 如果你省略了第二个参数,那么可见性就像从“外部”调用一样,例如。 只有公共财产可以被访问。 还要注意bindTo的工作方式,它不会修改原来的函数, 它会返回一个新的函数。
这是正常的做法。
顺便说一句,尝试删除&
它应该没有这个工作,因为对象以任何方式通过ref。
不要总是依靠PHP来通过引用来传递对象,当你自己分配一个引用时,行为与大多数OO语言中原来的指针被修改的行为是不一样的。
你的例子:
$CI = $this; $callback = function () use ($CI) { $CI->public_method(); };
应该:
$CI = $this; $callback = function () use (&$CI) { $CI->public_method(); };
注意参考“&”和$ CI应在最终调用完成后分配,否则可能会产生不可预知的输出,在PHP中访问引用并不总是与访问原始类相同 – 如果有意义的话。
这似乎是正确的,如果你通过引用传递它是正确的方法来做到这一点。 如果你使用PHP 5,你不需要$this
之前的&
符号,因为它总是通过引用传递。
这可以。 我认为你也可以这样做:
$CI = $this;
…因为涉及对象的分配将始终复制引用,而不是整个对象。