在匿名函数中使用$ 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中访问引用并不总是与访问原始类相同 – 如果有意义的话。

http://php.net/manual/en/language.references.pass.php

这似乎是正确的,如果你通过引用传递它是正确的方法来做到这一点。 如果你使用PHP 5,你不需要$this之前的&符号,因为它总是通过引用传递。

这可以。 我认为你也可以这样做:

 $CI = $this; 

…因为涉及对象的分配将始终复制引用,而不是整个对象。