这在某种程度上是对上一个问题的跟进-但我已经提炼了这个问题,并有"作品"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_func
和call_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);
我最终通过一个变通方法解决了这个问题,这最终是一个更好的选择。
最后,我得到了一个静态类,它有一个方法随机返回一个可能的标识符,然后另一个方法接受这个标识符,在每个类上构建匿名函数。
比我想要的稍微不那么优雅,但它最终工作得很好。
感谢大家的努力。