Ответ 1
http://www.php.net/manual/en/function.call-user-func-array.php
call_user_func_array('func',$myArgs);
Кажется, я помню, что в PHP есть способ передать массив как список аргументов для функции, разыменовывая массив стандартным способом func($arg1, $arg2)
. Но теперь я теряюсь на том, как это сделать. Я помню способ передачи по ссылке, как "glob" входящих параметров... но не как удалить список в список аргументов.
Это может быть так же просто, как func(&$myArgs)
, но я уверен, что это не так. Но, к сожалению, руководство php.net пока ничего не обнародовало. Не то чтобы мне пришлось использовать эту особенность в течение прошлого года или около того.
http://www.php.net/manual/en/function.call-user-func-array.php
call_user_func_array('func',$myArgs);
Также обратите внимание, что если вы хотите применить метод экземпляра к массиву, вам необходимо передать функцию как:
call_user_func_array(array($instance, "MethodName"), $myArgs);
Как уже упоминалось, с PHP 5.6+ вы также можете использовать маркер ...
(он же "оператор splat" ) как часть функциональности вариационных функций (см. здесь для дополнительной информации)
<?php
$array = ['Hello', 'World'];
function variadic($arg1, $arg2)
{
// Do stuff
echo $arg1.' '.$arg2;
}
// Splat $array in function call
variadic(...$array);
// Will echo 'Hello World'
Примечание. Элементы массива сопоставляются с аргументами по их позиции в массиве, а не их ключам.
ИЗМЕНИТЬ
Как и в случае с комментарием CarlosCarucce, распаковка аргументов (как показано выше) является самым быстрым методом во всем мире. В некоторых случаях он более чем в 5 раз быстрее, чем call_user_func_array
.
также
Потому что я думаю, что это действительно полезно (хотя и не напрямую связано с вопросом): вы можете type-hint параметр оператора splat в ваше определение функции, чтобы убедиться, что все переданные значения соответствуют определенному типу.
(Просто помните, что это MUST - последний параметр, который вы определяете, и что он связывает все параметры, переданные функции в массив.)
Это отлично подходит для обеспечения того, чтобы массив содержал элементы определенного типа:
<?php
// Define the function...
function variadic(SomeClass ...$items)
{
// All items will be of type `SomeClass`
foreach ($items as $item) {
$item->someClassInstanceMethod();
}
}
// Then call...
variadic(new SomeClass, new SomeClass);
// OR
$items = [
new SomeClass,
new SomeClass,
];
variadic(...$items);
Для полноты, как и PHP 5.1, это тоже работает:
<?php
function title($title, $name) {
return sprintf("%s. %s\r\n", $title, $name);
}
$function = new ReflectionFunction('title');
$myArray = array('Dr', 'Phil');
echo $function->invokeArgs($myArray); // prints "Dr. Phil"
?>
Смотрите: http://php.net/reflectionfunction.invokeargs
Для методов вы используете ReflectionMethod:: invokeArgs и передаете объект в качестве первого параметра.