2014-03-01 71 views
0

我試圖在我的匿名函數中調用「this」上下文,在對象內調用。 我正在運行PHP 5.5.9,php文檔聲明「$ this可以在匿名函數中使用」。 缺少什麼?我應該以某種方式將該上下文注入到該對象中嗎?匿名函數中的PHP「this」上下文

<?php 

class Example 
{ 
    public function __construct() 
    {} 

    public function test($func) 
    { 
     $func(); 
    } 
} 

$obj = new Example(); 

$obj->test(function(){ 
    print_r($this); 
}); 

?> 

輸出:

PHP Notice: Undefined variable: this on line 18 

回答

0

這個解決......它肯定嚇我,任何其他解決方案(如果存在)很好地接受。

<?php 

class Example 
{ 
    public function __construct() 
    {} 

    public function test($func) 
    { 
     $func = $func->bindTo($this, $this); 
     $func(); 
    } 
} 

$obj = new Example(); 

$obj->test(function(){ 
    print_r($this); 
}); 

?> 
+0

「任何其他解決方案(如果存在的話)都被廣泛接受」 - 取決於您嘗試實現的目標。 – VolkerK

+0

Im'試圖在匿名函數中使用「$ this」,而不在之前調用任何閉包方法。 –

+0

然後答案可能是「否」。但是,你試圖通過使用$這種方式來實現什麼?您可能會將bindTo()解釋爲依賴注入的一種方式,因此一般來說DI可能是一種選擇。 – VolkerK

1

好了,你居然可以在一個匿名函數使用$this但是你不能在對象之外使用它,這是沒有意義的。請注意,您可以在類定義之外定義該匿名函數。那麼在這種情況下$this意味着什麼?

一個簡單的解決方案是在類定義中定義函數或將指針作爲參數交給函數。

+0

你也可以使用函數名use(&$ obj){/ * code * /} – dab

+0

定義我沒有得到你的意思(&$ obj){/ * code * /}。請你舉個例子嗎? –

+0

我夢想着通過基於函數被調用的位置傳遞正確的上下文的php引擎auto。但我現在意識到這將是一個愚蠢和容易出錯的事情......你是對的! –

0

另一種解決方案是將$ this作爲函數的參數,並且只需在類$func($this)中通過調用即可。

<?php 

class Example { 
    … 
    public function test($func) 
    { 
     $func($this); 
    } 
} 

$obj = new Example(); 
$obj->test(function($this) { 
    print_r($this); 
}); 

?> 
+0

正確的,作爲第一個參數顯式傳遞範圍是一種可能性。 –