Я, кажется, помню, что в 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+ вы также можете использовать ...
токен (aka «splat operator») как часть функциональности вариационных функций ( см. Здесь для получения дополнительной информации )
<?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
.
ТАКЖЕ
Потому что я думаю, что это действительно полезно (хотя и не напрямую связано с вопросом): вы можете набирать тип оператора оператора splat в определении функции, чтобы убедиться, что все переданные значения соответствуют определенному типу.
(Просто помните, что это должно быть последним параметром, который вы определяете, и что он связывает все параметры, переданные функции в массив.)
Это отлично подходит для обеспечения того, чтобы массив содержал элементы определенного типа:
<?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 и передаете объект в качестве первого параметра.