在PHP 5.4.0以前版本的一个匿名函数中使用`$ this`

PHP手册说明

在PHP 5.4.0之前使用匿名函数使用$this是不可能的

在匿名功能页面上。 但是我发现我可以通过将$this分配给一个变量并将该变量传递给函数定义中的use语句来使其工作。

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

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


当你尝试调用一个受保护的或私有的方法时,它会失败,因为使用它就像从外面调用一样。 据我所知,在5.3中没有办法解决这个问题,但是来自PHP 5.4,它可以像预期的那样工作,开箱即用:

class Hello {

    private $message = "Hello worldn";

    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 worldn";

    public function createClosure() {
        return function() {
            echo $this->message;
        };
    }

}

class Bye {

    private $message = "Bye worldn";

}

$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

链接地址: http://www.djcxy.com/p/10143.html

上一篇: Using `$this` in an anonymous function in PHP pre 5.4.0

下一篇: Is this foreach loop responsible for god killing cats?