2017-05-31 38 views
0

我有一个复杂的场景,基于我正在使用的现有框架,它迫使我处理嵌套的call_user_func_array调用。我有一个文件有两个功能:PHP与类嵌套的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(如$this)的引用以及方法my_callback

their_caller()然后将该请求转发给their_callback并通过$options

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

我打电话get_class_methods()their_callback$options[0][0],它会显示方法列表,但由于某些原因,call_user_func_array($options[0], $options[1]);不会在MyClass打电话my_callback。我甚至可以拨打$options[0][0]->my_callback('HELLO');,它可以工作。我不能修改their_callertheir_callback。他们是框架的一部分。任何想法是什么阻止它的工作?

+0

奇怪的是,'$选项[0] [0] - > $选项[0] [1]($项[1]);'从内工作'their_callback' 。 – Ward

回答

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(); 
+0

传递给'their_caller'的原始参数是一个数组数组,所以'their_callback'只接收一个参数(内部数组),它在索引0处是一个引用MyClass和my_callback的数组, 1是我试图通过的字符串。 – Ward

+0

@Ward你正在尝试的上面也可以用这种方式实现。 https://eval.in/808757在这里我已经改变了'their_callback'的参数,并且改变了'$ operations'数组,你可以尝试调试我的代码https://eval.in/808668 –