【问题标题】:How to declare $this as an *use()* parameter in an anonymous function?如何在匿名函数中将 $this 声明为 *use()* 参数?
【发布时间】:2013-06-24 15:20:52
【问题描述】:

例子:

class foo {
    private $x=array();
    public function foo() {
        $z = function ($a) use (&$this->x) {
            ...
        }
    }
}

错误:不能使用 $this 作为词法变量


顺应情况,我们可以将anonymous声明为一个方法……那么另一个问题来了。我的“真实案例”,

// a very specific problem...
class foo {
    private $x=array();

    public function foo($m) {
    // ... use $this->x and $m ...
    return $ret;
}

    public function bar() {
    $str = preg_replace_callback('/aaaa/', $this->foo, $str);
    }
}

错误:未定义的属性 $foo ...

【问题讨论】:

    标签: php parameter-passing


    【解决方案1】:

    编辑:如果您需要从回调中修改私有属性,您的回调应该是一个对象方法,而不是闭包。所以:

    preg_replace_callback('/aaaa/', array($this, 'foo'), $str);
    

    foo 是您的方法。但是如果不需要修改属性,使用闭包作为回调并将x 的值分配给您use 的变量就可以了。


    我还应该提到,从 PHP 5.4 开始,您可以从闭包中访问 $this

    preg_replace_callback('/aaaa/', function($a){
      // $this->x is accessible here
    }, $str);
    

    【讨论】:

    • 是的,应对,一个不优雅的解决方案... PHP 没有更好的“转义语法”??
    • 好吧,优雅的解决方案是让$z 成为一个方法:)
    • 是的,将匿名函数作为一种方法的好主意。我编辑了问题给你看一个新问题。
    • PS:我可以编辑你的答案以将指针$that = &$this->x 添加为 Bgdan,并为我的具体问题添加宏伟的解决方案......还是你编辑? (那我可以接受)
    • 这里不需要引用或指针。我已经更新了 A。
    【解决方案2】:

    试试这个:

    class foo {
        private $x=array();
        public function foo() {
            $v = &$this->x;
            $z = function ($a) use ($v) {
                ...
            }
        }
    }
    

    【讨论】:

    • 是的,处理一个指针,一个不优雅的解决方案...... PHP 没有更好的“转义语法”??
    • 这是最强大的,我会信任的
    • & 有什么用?闭包没有得到参考。你也需要use(&$v)。并通过引用将私有属性传递给匿名者。函数打破了基本的 OO 概念 :) 您不妨将属性公开
    猜你喜欢
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多