2017-05-31 126 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 –