PHPのcreate_function結果がインスタンス変数として保存され、$ object-> func()と呼ばれていますか?

私はデータベースから関数定義を動的にロードするPHPの create_function($ args、$ code)関数を使用しています。

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

I have a class MyClass which has an instance variable myFunction. The constructor populates that instance variable with the result of a call to create_function. I'm hoping to dynamically create a function for the specific object (once instantiated) of this class, that can be called as $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.

When I run var_dump($object->myFunction) I get back "lambda_xx", which is a good sign meaning create_function is at least working.


作品に対する面白いアップデートと作業しないケース

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

   $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

This doesn't work, but if instead of pulling the object $pm from Yii::app()->user->postMatching I just create a new one:

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

$c();//THIS WORKS NOW!

So naturally I var_dumped $pm and $c in both the "newly created" case and the case where I get it from Yii::app()->user->postMatching, and they are identical. The only thing that is different is the name of the anonymous function (as expected).

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


新しく発見された "ツイスト"で上記を更新しました。ありがとうございました!

2

3 答え

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

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);
     }

}
2
追加された
確かに困惑した
追加された 著者 deceze,
@Levi $ this-> myFunction は、通常のグローバル関数の名前を示す文字列であるため、必要はないはずです。 : - ?
追加された 著者 deceze,
call_user_func_array(array($ this、myFunction)、$ args)
追加された 著者 Levi Morrison,
$ this-> myFunction の値は通常のものとグローバルなものがありますが、それにアクセスするには配列の構文を使用する必要があります。
追加された 著者 Levi Morrison,
"call_user_func_array()は、パラメータ1が有効なコールバック、関数 ''が見つからないか、関数名が無効であることを期待しています。上記を試すとき。私はvar_dump($ this-> myFunction)私は "lambda_xx"を取得するので、その空のようではない.... 困惑
追加された 著者 csjohn,
@deceze私はちょうど上記の質問の底を更新 - いくつかの新しい奇妙な行動を見つけた。 (つまり、同じブロック内に新しいオブジェクトを作成し、そのオブジェクトを罰金と呼んでいれば...そうでなければそうではない)
追加された 著者 csjohn,

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

call_user_func($object->myFunction, args..);
2
追加された

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

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

See it in action.

2
追加された
@csjohn:実際の例があなたとは異なるコードでない限り、これは不可能です。その場合は、実際のコードを投稿してください。
追加された 著者 Jon,
@csjohn:OK、それを見て、質問する必要があります:なぜメソッドの代わりにプロパティを公開しているのですか?なぜ function findRelatedPosts($ post、$ limit){...} しないのですか?
追加された 著者 Jon,
@csjohn:しかしそれをやってすぐにあなたの問題を解決するでしょう!
追加された 著者 Jon,
私はその構文を試しましたが、呼び出し自体はまだ起動しません。この場合、私はvar_dump($ method)を "lambda_xx"としますが、$ method(arg1、arg2)を呼び出すとエラーになります。この場合の$ methodは$オブジェクトのメソッドを特に参照していますか?$ object-> $ method(試行錯誤)のようなものが必要でしょうか?注意:私はこれらの呼び出しをループ内のanon関数に行っていますが、$メソッド自体はループの前にインスタンス化されています。
追加された 著者 csjohn,
上記の質問にこの問題に関する実際のコードを追加しました。ありがとう!
追加された 著者 csjohn,
この時点で、ただそれを働かそうとしています。私がバリアを渡すと、私は動的インスタンス変数の匿名メソッドをラップしてそのように呼び出すパブリックメソッドを記述します。
追加された 著者 csjohn,
私はあまりにも、私はそれをラップしようと思ったと思った。その場合、呼び出しはラッパー関数に "イン"しますが、実際に匿名関数を呼び出す行に到達すると、同じ方法でエラーが発生します。私は私の問題のいくつかの新しい情報と癖で上記の質問(下に向かって)を更新しました。
追加された 著者 csjohn,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com