У меня сложный сценарий, основанный на существующей платформе, которую я использую, которая заставляет меня иметь дело с вложенными 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]
и увидеть, что это массив, содержащий ссылку на MyClass
а также my_callback
,
Я звоню get_class_methods()
на $options[0][0]
в their_callback
и он покажет список методов, но по какой-то причине, call_user_func_array($options[0], $options[1]);
не буду звонить my_callback
на MyClass
, Я могу даже позвонить $options[0][0]->my_callback('HELLO');
и это работает.
К сожалению, я не могу изменить their_caller
или же their_callback
, Они являются частью структуры. Есть идеи, что мешает ему работать?
Замечания: Ваша функция
their_callback
получит два аргумента.
Попробуйте этот фрагмент кода здесь
<?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();
Других решений пока нет …