PHP create_function实例变量-无法调用匿名函数:后续处理


PHP create_function Instance variable - Unable to call anonymous function: Follow up

这在某种程度上是对上一个问题的跟进-但我已经提炼了这个问题,并有"作品"vs。"不起作用"的情况更精确地缩小了范围。

我的目标:我有一个类MyClass,它有一个实例变量myFunction。在创建MyClass对象(实例化)后,构造函数将实例变量myFunction与调用create_function的结果(其中代码和参数来自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();
     }
}

然而,如果我执行以下操作(在另一个文件中),它会错误地说undefined function () in…中的Apache错误日志。

//I'm using Yii framework, and this is getting the user 
//objects instance variable 'myClass'. 
$object = Yii::app()->user->myClass; 
$object->TestCallAnon(); // **FAILS**

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

此外,对call_user_funccall_user_func_array调用的几种变体不起作用。

如果有人能提供任何见解或帮助,那就太好了:)。

提前感谢!

在PHP中不能像在JavaScript中那样传递对函数的引用。

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

我最终通过一个变通方法解决了这个问题,这最终是一个更好的选择。

最后,我得到了一个静态类,它有一个方法随机返回一个可能的标识符,然后另一个方法接受这个标识符,在每个类上构建匿名函数。

比我想要的稍微不那么优雅,但它最终工作得很好。

感谢大家的努力。