【问题标题】:PHP create_function Instance variable - Unable to call anonymous function: Follow upPHP create_function 实例变量 - 无法调用匿名函数:跟进
【发布时间】:2011-10-28 22:40:01
【问题描述】:

这在某种程度上是对上一个问题的跟进 - 但我已经提炼了这个问题,并且更精确地缩小了“有效”与“无效”案例的范围。

我的目标: 我有一个类MyClass,它有一个实例变量myFunction。在创建MyClass 对象(实例化)时,构造函数将调用create_function 的结果分配给实例变量myFunction(其中代码和参数来自db 调用)。

一旦创建了MyClass 类型的对象(并作为另一个类的实例变量存储在别处),我希望能够从我拥有的“任何地方”调用myFunction(实例变量匿名函数) MyClass 对象。


实验用例 -- 下面是我高度简化的测试代码,用于说明哪些有效与哪些无效(即预期功能中断时)

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

}

但是,如果我执行以下操作(在另一个文件中,它会在 Apache 错误日志中显示 undefined function () in... 错误。

//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 yii anonymous-function anonymous-methods


    【解决方案1】:

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

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

    【讨论】:

    • 您好,谢谢您的建议。我实际上已经尝试过 'call_user_func(array($object, $funcName), array())' 没有运气。它错误地说'行为没有名为“”的方法或闭包。',暗示 $funcName 我猜是空的?但是当我在上面回显 $funcName 一行时,它给了我“lambda_3”。
    • 这看起来不像您从 call_user_func 得到的 PHP 错误。
    【解决方案2】:

    我最终通过一种变通方法解决了这个问题,无论如何它最终都是一个更好的选择。

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

    没有我想要的那么优雅,但它最终运行良好。

    感谢大家的努力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 2011-03-03
      • 1970-01-01
      • 2014-09-11
      • 2014-04-03
      • 1970-01-01
      • 2015-12-03
      相关资源
      最近更新 更多