2013-06-24 71 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)'。並通過參考將一個私人財產傳遞給一個匿名者。函數打破了基本的面向對象的概念:)然後你可能會讓該屬性公開 –