如何在匿名函数中将$ this声明为* use()*参数?

时间:2013-06-24 15:20:53

标签: php parameter-passing

示例:

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

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


符合情况,我们可以将匿名声明为方法......所以另一个问题就到了。我的“真实案例”,

// 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 ...

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

试试这个:

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