Кажется, я помню, что в PHP есть способ передать массив в виде списка аргументов для функции, разыменовывая массив стандартным func($arg1, $arg2)
способом. Но теперь я заблудился, как это сделать. Я вспоминаю способ передачи по ссылке, как «глобализировать» входящие параметры ... но не как вывести массив из списка аргументов.
Это может быть так просто func(&$myArgs)
, но я уверен, что это не так. Но, к сожалению, руководство php.net пока ничего не разглашает. Не то чтобы я использовал эту особенность в течение последнего года или около того.
$args = [1,2,3]; function(...$args){}
callable
, который использует то же самоеcall_user_func_array
, только с массивом, где первый элемент - объект, а второй - метод. Напримерcall_user_func_array([$object, 'method'], $myArgs);
Как уже упоминалось , начиная с PHP 5.6+ вы можете (должны!) Использовать
...
токен (он же «оператор сплат », часть функциональности функций с переменными числами ), чтобы легко вызывать функцию с массивом аргументов:Примечание. Элементы массива сопоставляются с аргументами по их положению в массиве, а не по ключам.
Согласно комментарию CarlosCarucce в это форма аргумента распаковки является самым быстрым способом на сегодняшний день во всех случаях. В некоторых сравнениях это более чем в 5 раз быстрее, чем
call_user_func_array
.В стороне
Потому что я думаю, что это действительно полезно (хотя и не имеет прямого отношения к вопросу): вы можете напечатать подсказку параметра оператора splat в своем определении функции, чтобы убедиться, что все переданные значения соответствуют определенному типу.
(Просто помните, что при этом ДОЛЖЕН быть последний заданный вами параметр и он объединяет все параметры, переданные функции в массив.)
Это отлично подходит для того, чтобы убедиться, что массив содержит элементы определенного типа:
источник
call_user_func_array
. Так что если вы используете php 5.6+, я бы порекомендовал этот. Вот тест , который был процитирован в официальном php wikiТакже обратите внимание, что если вы хотите применить метод экземпляра к массиву, вам нужно передать функцию как:
источник
$foo->bar()
Пример на связанной странице предполагает, что так и должно бытьarray($instance, "MethodName")
.call_user_func_array(array(parent, "__construct"), func_get_args());
Для полноты, с PHP 5.1 это тоже работает:
Смотрите: http://php.net/reflectionfunction.invokeargs
Для методов вы используете ReflectionMethod :: invokeArgs вместо этого и передаете объект в качестве первого параметра.
источник