2017-05-31 21 views
0

私は既存のフレームワークに基づいた複雑なシナリオを使用しています。これは、入れ子になったcall_user_func_arrayコールを処理することを余儀なくされています。私は2つの機能を持つファイルを持っている: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]); 
} 

は、その後、私は持つクラスといくつかのpublicメソッドを持つ別のファイルがあります:私はMyClassの新しいインスタンスにmy_caller()を呼び出すと

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

を、それをtheir_callerが呼び出され、MyClass$this)とmy_callbackという参照を含む引数の配列が渡されます。

their_caller()は、their_callbackに要求を転送し、$optionsを転送します。

their_callback$options[0]をデバッグして、MyClassmy_callbackへの参照を含む配列であることがわかります。

私はtheir_callback$options[0][0]get_class_methods()を呼び出し、それがメソッドの一覧が表示されますが、何らかの理由で、call_user_func_array($options[0], $options[1]);MyClassmy_callbackを呼び出すことはありません。私も$options[0][0]->my_callback('HELLO');と呼ぶことができ、それは動作します。

残念ながら、their_callerまたはtheir_callbackは変更できません。それらはフレームワークの一部です。それが働くのを妨げる何かのアイデア?

+0

、 '$オプション[0] [0] - > $オプション[0] [1]($オプション[1]);' 'their_callback'内から動作。 – Ward

答えて

0

注:あなたの機能their_callbackは2つの引数を受け取ります。奇妙なこと

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つのパラメータ(内部配列) 1は私が通過しようとしている文字列です。 – Ward

+0

@Wardこのようにしても、あなたが試していることが達成できます。 https://eval.in/808757ここで私は 'their_callback'のパラメータを変更せず、' $ operations'配列を変更しました。私のコードhttps://eval.in/808668のデバッグを試すことができます –