2013-06-24 154 views
0

例子:

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

错误:不能使用$以此为词法变量


顺应形势,我们可以声明匿名的方法......所以另外一个问题到达。我的“真实案例”,

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

回答

1

编辑:它看起来像你的回调应该是一个对象的方法,而不是关闭,如果你需要修改从回调的私人财产。所以:

其中foo是你的方法。但是,如果该属性不需要修改,则使用闭包作为回调并将x的值分配给您的use没问题的变量。


我还要提到的是从PHP 5.4,你可以从瓶盖内访问$this

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

是的,应对非完美的解决方案.. 。没有比PHP更好的“转义语法”了? –

+2

那么优雅的解决方案是使'$ z'成为一种方法:) –

+0

是的,把匿名函数作为方法的好理想。我编辑了这个问题,看到一个新问题。 –

1

试试这个:

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

是的,应对一个指针,一个非优雅的解决方案...没有更好的“escape语法”与PHP? –

+0

这是最健壮的,我会信任的 –

+1

'&'是什么?封闭没有得到一个参考。你也需要使用(&$ v)'。并通过参考将一个私人财产传递给一个匿名者。函数打破了基本的面向对象的概念:)然后你可能会让该属性公开 –