PHP嵌套了带类的call_user_func_array

时间:2017-05-31 04:28:49

标签: php class callback call-user-func-array

我有一个复杂的场景,基于我使用的现有框架迫使我处理嵌套的call_user_func_array调用。我有一个包含两个函数的文件:

function their_caller($options)
{
  call_user_func_array('their_callback', $options);
}

function their_callback($options)
{
  call_user_func_array($options[0], $options[1]);
}

然后我有另一个带有类和一些公共方法的文件:

namespace FOO;

class MyClass
{
   public function my_caller()
   {
     $operations = array(
       array(
         array($this, 'my_callback'),
         'Hello World'
       )
     );

     their_caller($operations);
   }

   public function my_callback($text)
   {
     print $text;
   }
} 

当我在my_caller()的新实例上调用MyClass时,它会调用their_caller,然后传递包含对MyClass的引用的参数数组(作为{{1} }}以及方法$this

my_callback然后将请求转发给their_caller()并传递their_callback

$options我可以调试their_callback,看到它是一个包含对$options[0]MyClass的引用的数组。

我在my_callback的{​​{1}}上致电get_class_methods(),它会显示方法列表,但出于某种原因,$options[0][0]不会调用{{1}在their_callback上。我甚至可以致电call_user_func_array($options[0], $options[1]);,但它确实有效。

很遗憾,我无法修改my_callbackMyClass。它们是框架的一部分。什么想法阻止它工作?

1 个答案:

答案 0 :(得分:0)

  

注意:您的函数their_callback将收到两个参数。

Try this code snippet here

<?php
ini_set('display_errors', 1);
function their_caller($options)
{
    call_user_func_array('their_callback', $options);
}
//first argument will receive callback
//second argument will receive the text which you want to send as argument.
function their_callback($callback,$option) 
{
    //call_user_func_array should expect second argument as array not string.
    call_user_func_array($callback, array($option));
    //here we have converted `$option` string(Hello World) to array.
}

class MyClass
{
    public function my_caller()
    {
        $operations = array(
        array(
         array($this, 'my_callback'),
                    'Hello World'
                )
            );
        call_user_func_array('their_caller', $operations);
    }

    public function my_callback($text)
    {
        print $text;
    }


} 
$object= new MyClass();
$object->my_caller();