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

2022-08-30 08:00:04

PHP 手册指出

在 PHP 5.4.0 之前,不能从匿名函数使用$this

匿名函数页面上。但是我发现我可以通过分配给变量并将变量传递给函数定义的语句来使其工作。$thisuse

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

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


答案 1

当您尝试对其调用受保护或私有方法时,它将失败,因为以这种方式使用它算作从外部调用。据我所知,在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指向的内容,以获取匿名函数(闭包重新绑定):

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() 方法,其中第一个参数可用于指定$this指向的内容,第二个参数控制可见性级别应是什么。如果省略第二个参数,可见性将类似于从“外部”调用,例如。只能访问公共属性。还要注意bindTo的工作方式,它不会修改原始函数,而是返回一个新函数。


答案 2

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


推荐