【问题标题】:Reassignment of $this in PHP在 PHP 中重新分配 $this
【发布时间】:2011-08-18 22:28:34
【问题描述】:

我知道这可能是一个敏感的决定,但我希望我们避免诸如“请不要”之类的回答。

我有一个类,它的构造函数将回调作为参数。在这个回调中,我认为$this 变量可用作回调所属实例的引用,这在语义上是最正确的。 (我注意到 5.4 已在匿名函数的上下文中恢复 $this在类中定义,但是即使这种更改在这里也无济于事,因为函数作为参数传递到前面提到的构造函数)

问题在于实例没有作为参数传递给回调,而是由use()提供

use() 有哭诉$this 的倾向,表示它不能用作词法变量。

有没有办法在不将其作为参数传递的情况下(任何方法,use() 可能都可以)来实现这一点?

顺便说一句,我唯一能想到的就是:

 ... function($foo, $bar)
    use($array_with_this){
        extract($array_with_this); // contains instance with key 'this'

        // code using $this

    } ...

但这是强制附加要求,我宁愿不需要。

【问题讨论】:

    标签: php scope this


    【解决方案1】:
    $that = $this;
    cb(function () use ($that) {
        $that-> ...
    });
    

    $this 是一个特殊关键字,您不能在对象上下文之外使用它。并且匿名函数当前在对象上下文之外运行。这显然会在下一个版本的 PHP (5.4) 中改变。

    【讨论】:

    • 谢谢@deceze。这就是我已经在做的事情。尽管针对实例对$this 进行了更改,但新的 PHP 版本实际上并不能解决这个问题。 $GLOBALS['this'] = ...extract(array('this' => ...)) 之类的技巧对这里有帮助吗?
    • 那么,匿名函数会在调用它们的上下文中运行吗?因此,如果我从一个类中调用它们,它们将受到它们被调用的类的限制?
    • @Bracket 恐怕这是目前唯一的解决方案。
    • @Mark 不,如果我没记错的话,上下文完全丢失了。所以你甚至无法访问protectedprivate 成员。
    • @Bracket 真正的问题是$this 是一个魔术变量$this 总是表示“当前对象”。您不能使用“$this”来传递物体。
    猜你喜欢
    • 1970-01-01
    • 2014-05-26
    • 2013-10-15
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多