2011-10-28 48 views
1

這有點跟上一個前面的問題 - 但我已經提出了問題,並有「工作」與「不工作」的情況下更精確地縮小了範圍。PHP create_function實例變量 - 無法調用匿名函數:跟進

我的目標: 我有一個類MyClass具有可變myFunction一個實例。創建MyClass對象(實例化)後,構造函數將實例變量myFunction與調用create_function(其中代碼和參數來自數據庫調用)的結果進行分配。

一旦MyClass類型此對象被創建(並存儲爲另一個類的一個實例變量別處)我希望能夠調用由「無處不在」,我有MyClass對象myFunction(實例變量匿名函數)。


實驗案例 - 下面是我的高度簡化的測試代碼來說明什麼可行什麼與不(即當預期功能中斷)

class MyClass extends AnotherClass { 

    public $myFunction; 

    function __construct() { 

     $functionCode = 'echo "NyanNyanNyan";'; 

     $this->myFunction(); 

     /*Now the following code works as expected if put in here for testing*/ 
     $anonFunc = $this->myFunction; 
     $anonFunc(); //This call works just fine (echos to page)! 

     /*And if i make this call, it works too! */ 
     self::TestCallAnon();  

    } 

    public function TestCallAnon() { 

      $anonFunc2 = $this->myFunction; 
      $anonFunc2(); 
    } 

} 

但是,如果我這樣做以下(在另一個文件中,它錯誤說未定義功能()在... Apache的錯誤日誌中。

//I'm using Yii framework, and this is getting the user 
//objects instance variable 'myClass'. 

$object = Yii::app()->user->myClass; 

$object->TestCallAnon(); // **FAILS** 

$func = $object->myFunction; 
$func(); // ** ALSO FAILS ** 

此外,爲call_user_funccall_user_func_array電話的幾個變化不工作。

如果任何人能夠提供任何見解或幫助,那將是偉大的:)。

在此先感謝!

回答

0

我最終通過一個解決方案解決了這個問題,最終成爲了一個更好的選擇。

在我結束了具有靜態類,有哪些接受標識符建立在每一類的匿名功能的方法隨機返回可能標識符中的一個,然後另一種方法的結束。

稍微不如我想要的優雅,但它最終運作良好。

感謝大家的努力。

1

你不能在PHP中傳遞對函數的引用,就像你可以在JavaScript中一樣。

call_user_func具有有限的功能。你可以這樣使用它:

class MyClass { 
    function func() {} 
    static function func() {} 
} 
function myfunc() {} 

$i = new MyClass(); 

call_user_func("myfunc", $args); 
call_user_func(array($i, "func"), $args); 
call_user_func(array(MyClass, "staticFunc"), $args); 
+0

嘿,謝謝你的建議。其實我已經試過 'call_user_func(陣列($對象,$了funcName),陣列())',沒有運氣。它錯誤說「的行爲不具有一個名爲‘’的方法或關閉。」,這意味着$了funcName是空的我猜?但是,當我回聲線高於$了funcName,它給了我「lambda_3」。 – csjohn

+0

這看起來並不像PHP的錯誤你會從'call_user_func'得到。 – Halcyon