2

PHPcreate_function($args, $code)関数を使用して、データベースから関数定義を動的にロードしています。

私がそれを実装しようとしている方法は次のとおりです。

MyClassインスタンス変数を持つクラスがありますmyFunction。コンストラクターは、そのインスタンス変数に への呼び出しの結果を設定しますcreate_function。このクラスの特定のオブジェクト (インスタンス化された後) に対して、次のように呼び出すことができる関数を動的に作成したいと考えています。$object->myFunction(arg1, arg2);

したがって、私のクラスは次のようになります。

class MyClass {

     public $myFunction = '';

     public function __construct() {
         $this->myFunction = //return function body from DB call.
     }


}

次に、インスタンス化された「MyClass」オブジェクトで、プログラムの他の場所からこの動的関数を呼び出そうとしています...

$object = new MyClass();
$object->myFunction(args..); 

ただし、次のようなエラーが発生し続けます。

MyClass and its behaviors do not have a method or closure named myFunction.

実行するvar_dump($object->myFunction)と、「lambda_xx」が返されます。これはcreate_function、少なくとも機能していることを意味する良い兆候です。


機能するケースと機能しないケースの興味深い最新情報

私の「他のファイル」で、次のことを行っていることがわかりました。

   $pm = Yii::app()->user->postMatching; //This is a PostMatching object made elsewhere
    $c = $pm->findRelated;

    foreach ($posts as $post) {

        var_dump($c);

        $postIds = $c($post, $limit);

        //post to related mapping
        $specificRelatedPostIds[$post->postId] = $postIds;

    }
    exit; // exiting for testing

これは機能しませんが、オブジェクトをプルする代わりに、新しいオブジェクトを作成するだけ$pmの場合:Yii::app()->user->postMatching

$pm = new PostMatching();
$c = $pm->findRelated; //the anon function instance variable

$c(); // THIS WORKS NOW!

したがって、当然のことながら、「新しく作成された」ケースと から取得したケースの両方でvar_dumped$pmし、それらは同一です。唯一の違いは、無名関数の名前です (予想どおり)。$cYii::app()->user->postMatching

なぜこれが当てはまるのか、誰にも分かりますか?どちらの場合も、そのインスタンス変数を持つ$pmインスタンス化さPostMatchingれたオブジェクトです。構文を使用してそれを呼び出すことができません!


新しく発見された「ツイスト」で上記を更新しました、ありがとう!

4

3 に答える 3

2

次のようにメソッドを呼び出すことができます。

call_user_func($object->myFunction, args..);
于 2011-10-28T03:48:34.823 に答える
2

たぶん、これらの行に沿った何かが役立つかもしれません:

class MyClass {

     private $myFunction = '';

     public function __construct() {
         $this->myFunction = //return function body from DB call.
     }

     public function myFunction() {
         $args = func_get_args();
         return call_user_func_array($this->myFunction, $args);
     }

}
于 2011-10-28T03:49:47.303 に答える
2

これは、PHP が持つ解析関連の問題によるものです。このバージョンは動作するはずです:

$object = new MyClass();
$method = $object->myFunction;
$method(args..); 

実際に見てください

于 2011-10-28T03:22:28.123 に答える