在PHP 5.4.0之前的匿名函数中使用`$ this`

时间:2011-12-05 20:01:51

标签: php anonymous-function

PHP手册说明

  

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

anonymous functions page上的

。但我发现我可以通过将$this赋给变量并将变量传递给函数定义中的use语句来使其工作。

$CI = $this;
$callback = function () use ($CI) {
    $CI->public_method();
};

这是一个好习惯吗? 有没有更好的方法来使用PHP 5.3访问匿名函数中的$this

5 个答案:

答案 0 :(得分:65)

当您尝试在其上调用受保护或私有方法时,它将失败,因为以这种方式使用它会被视为从外部调用。据我所知,在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指向anonymus函数(闭包重新绑定):

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,其中第一个参数可用于指定$指向的内容,第二个参数控制可见性级别。如果省略第二个参数,则可见性就像从“外部”调用,例如。只能访问公共属性。另请注意bindTo的工作方式,它不会修改原始函数,会返回一个新函数

答案 1 :(得分:6)

不要总是依赖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

答案 2 :(得分:5)

这是正常的做法 b.t.w,尝试删除&它应该没有这个,因为对象以任何方式通过ref。

答案 3 :(得分:1)

如果您通过引用传递它是正确的方法,那似乎没问题。如果您使用PHP 5,则&之前不需要$this符号,因为无论如何它总是通过引用传递。

答案 4 :(得分:1)

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

$CI = $this;

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