обратный вызов — передача функций с аргументами в качестве аргументов

У меня есть несколько взаимозаменяемых функций с различным количеством аргументов, например:

function doSomething1($arg1) {
…
}

function doSomething2($arg1, $arg2) {
…
}

Я хотел бы передать определенное количество этих функций с аргументами другой функции обработки, такой как:

function doTwoThings($thing1, $thing2) {
$thing1();
$thing2();
}

Очевидно, что этот синтаксис неправильный, но я думаю, что он понял мою точку зрения. Функция обработки будет вызываться примерно так:

doTwoThings(‘doSomething1(‘abc’)’, ‘doSomething2(‘abc’, ‘123’));

Итак, вопрос в том, как это на самом деле делается?

Из моих исследований звучит так, как будто я могу «обернуть» вызовы функций «doSomething» в анонимной функции, дополнить их аргументами и передать эти «обернутые» функции в функцию «doTwoThings», а анонимная функция не технически есть аргументы, которые они могли бы вызывать способом, показанным выше во втором фрагменте кода. Документация PHP запутала меня, и ни один из примеров, которые я нашел, не собрал все вместе. Любая помощь будет принята с благодарностью!

0

Решение

Вы могли бы использовать call_user_func_array() который принимает обратный вызов (например, функцию или метод класса для запуска) и аргументы в виде массива.

http://php.net/manual/en/function.call-user-func-array.php

func_get_args() означает, что вы можете передать эту функцию и произвольное количество аргументов.

http://php.net/manual/en/function.func-get-args.php

domanythings(
array( 'thingonename', array('thing','one','arguments') ),
array( 'thingtwoname', array('thing','two','arguments') )
);

funciton domanythings()
{
$results = array();
foreach( func_get_args() as $thing )
{
// $thing[0] = 'thingonename';
// $thing[1] = array('thing','one','arguments')
if( is_array( $thing ) === true and isset( $thing[0] ) and is_callable( $thing[0] ) )
{
if( isset( $thing[1] ) and is_array( $thing[1] ) )
{
$results[] = call_user_func_array( $thing[0], $thing[1] );
}
else
{
$results[] = call_user_func( $thing[0] );
}
}
else
{
throw new Exception( 'Invalid thing' );
}
}
return $results;
}

Это было бы так же, как делать

thingonename('thing','one','arguments');
thingtwoname('thing','two','arguments');
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector