在PHP 5.4.0之前版本中的匿名函数中使用“$this”

在PHP 5.4.0之前版本中的匿名函数中使用“$this”,php,anonymous-function,Php,Anonymous Function,PHP手册说明 在PHP之前,无法使用匿名函数中的$this 5.4.0 在路上。但是我发现我可以通过将$this分配给变量并将变量传递给函数定义处的use语句来实现它 $CI = $this; $callback = function () use ($CI) { $CI->public_method(); }; 这是一种好的做法吗? 使用PHP5.3在匿名函数中访问$this是否有更好的方法?如果通过引用传递,这似乎是正确的方法。如果您使用的是PHP5,则在$this之前不需

PHP手册说明

在PHP之前,无法使用匿名函数中的
$this
5.4.0

在路上。但是我发现我可以通过将
$this
分配给变量并将变量传递给函数定义处的
use
语句来实现它

$CI = $this;
$callback = function () use ($CI) {
    $CI->public_method();
};
这是一种好的做法吗?

使用PHP5.3在匿名函数中访问
$this
是否有更好的方法?

如果通过引用传递,这似乎是正确的方法。如果您使用的是PHP5,则在
$this
之前不需要
&
符号,因为它始终通过引用传递。

这很好。我想你也可以这样做:

$CI = $this;

。。。因为涉及对象的赋值总是复制引用,而不是整个对象。

这是通常的方式。

b、 t.w,尝试删除
&
,如果没有这个,它应该可以工作,因为对象以任何方式通过ref。

当您尝试调用受保护的或私有的方法时,它将失败,因为使用这种方式视为从外部调用。据我所知,在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"
更重要的是,对于匿名函数(闭包重新绑定),您将能够在运行时更改$this指向的内容:


实际上,anonymus函数将具有一个参数,其中第一个参数可用于指定$this指向的对象,第二个参数控制可见性级别应为多少。如果省略第二个参数,可见性将类似于从“外部”调用,例如,只能访问公共属性。还要注意bindTo的工作方式,它不修改原始函数,它返回一个新函数

不要总是依赖PHP通过引用传递对象,当您分配引用本身时,其行为与大多数OO语言中修改原始指针的行为不同

你的例子是:

$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
应该是:

$CI = $this;
$callback = function () use (&$CI) {
$CI->public_method();
};
请注意,引用“&”和$CI应该在对其进行最后调用之后分配,否则您可能会有不可预测的输出,在PHP中,访问引用并不总是与访问原始类相同——如果这有意义的话


OP必须使用5.3或更高版本,因为4.x不支持匿名功能:-)只是一个次要的论坛惯例-通常接受答案比编辑问题以反映您的首选答案更好。这主要是为了让回答永远有意义,但当然也是为了给正确的答案打分和
$CI=&$this实际上并不完全相同。也许是为了你的目的,但它们不一样。试试
$CI='bla';var_dump($this)$this
的对象的公共方法。可以使用反射访问。效率低下,有点邪恶,但它是有效的。
$CI = $this;
$callback = function () use (&$CI) {
$CI->public_method();
};