2

我正在使用 PHPscreate_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.
     }


}

然后,我尝试通过执行类似...

$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

这不起作用,但如果不是从中拉出对象$pmYii::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对象,我只是无法使用语法来调用它!


刚刚用新发现的“Twists”更新了上面的内容,谢谢大家!

4

3 回答 3

2

这是由于 PHP 存在解析相关的问题。这个版本应该可以工作:

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

看到它在行动

于 2011-10-28T03:22:28.123 回答
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 回答