2011-10-28 3 views
1

これは以前の質問に続くフォローアップですが、質問を絞り込み、「作品」と「うまくいかない」ケースはるかに正確に絞られました。PHP create_functionインスタンス変数 - 無名関数を呼び出すことができません:フォローアップ

私の目標: 私はインスタンス変数myFunctionを持つクラスMyClassを持っています。 MyClassオブジェクトを作成すると(インスタンス化)、コンストラクタはインスタンス変数myFunctioncreate_function(ここでコードとargはdb呼び出しから取得されます)の呼び出し結果を割り当てます。

タイプ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** 
加えて、3210

または

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

call_user_funccall_user_func_arrayへの呼び出しのいくつかのバリエーションが動作しません。

誰かが洞察力や助けを提供できれば素晴らしいです:)。

ありがとうございます!

答えて

0

私はとにかく良い選択肢になってしまった回避策を経由してこの問題を解決することになりました。

最後に、可能な識別子の1つをランダムに返すメソッドを持つ静的クラスと、その識別子を受け入れて各クラスに無名関数を構築する別のメソッドを持つことになりました。

ほんの少しエレガントですが、うまく機能します。

あなたの努力のおかげで皆に感謝します。

1

たとえば、JavaScriptなどのように、PHPで関数の参照を渡すことはできません。

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(array($ object、$ funcName)、array())'を運行なしで試しました。これは、 '振る舞いにはメソッドやクロージャという名前のない "というエラーがあります。つまり、$ funcNameが空であることを意味します。しかし、私は$ funcNameの上にその行をエコーすると、それは私に "lambda_3"を与えます。 – csjohn

+0

'call_user_func'から得られるPHPエラーのようには見えません。 – Halcyon

関連する問題