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
し、それらは同一です。唯一の違いは、無名関数の名前です (予想どおり)。$c
Yii::app()->user->postMatching
なぜこれが当てはまるのか、誰にも分かりますか?どちらの場合も、そのインスタンス変数を持つ$pm
インスタンス化さPostMatching
れたオブジェクトです。構文を使用してそれを呼び出すことができません!
新しく発見された「ツイスト」で上記を更新しました、ありがとう!