首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在PHP 5.4.0之前的版本中在匿名函数中使用`$this`

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

Stack Overflow用户
提问于 2011-12-06 04:01:51
回答 5查看 52.8K关注 0票数 86

PHP手册说明

5.4.0之前,不能使用匿名函数中的$this

anonymous functions page上。但我发现,我可以通过将$this赋给一个变量并将该变量传递给函数定义处的use语句来使其工作。

代码语言:javascript
复制
$CI = $this;
$callback = function () use ($CI) {
    $CI->public_method();
};

这是一个好的实践吗?

有没有更好的方式使用PHP5.3在匿名函数中访问$this

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-06 04:10:51

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

代码语言:javascript
复制
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指向的内容:

代码语言:javascript
复制
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,其中第一个参数可用于指定$this指向的内容,第二个参数控制可见性级别应为。如果你省略了第二个参数,可见性就像从“外部”调用一样,例如。只能访问公共属性。还要注意bindTo的工作方式,它不会修改原始函数,而是返回一个新的。

票数 67
EN

Stack Overflow用户

发布于 2012-02-18 20:38:41

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

您的示例:

代码语言:javascript
复制
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};

应该是:

代码语言:javascript
复制
$CI = $this;
$callback = function () use (&$CI) {
$CI->public_method();
};

注意,引用"&“和$CI应该在最终调用它之后赋值,否则你可能会有不可预测的输出,在PHP中访问引用并不总是与访问原始类相同-如果这是有意义的话。

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

票数 8
EN

Stack Overflow用户

发布于 2011-12-06 04:06:44

这是正常的方式。

b.t.w,试着删除&,它应该在没有这个的情况下工作,因为对象是以任何方式通过引用传递的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8391099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档