Передача массива в виде аргументов, а не массива, в PHP

Я, кажется, помню, что в PHP есть способ передать массив как список аргументов для функции, разыменовывая массив в стандартный метод func($arg1, $arg2) . Но теперь я теряюсь на том, как это сделать. Я помню способ передачи по ссылке, как «glob» входящих параметров … но не как удалить список в список аргументов.

Это может быть так же просто, как func(&$myArgs) , но я уверен, что это не так. Но, к сожалению, руководство php.net пока ничего не обнародовало. Не то, чтобы я использовал эту особенность в течение прошлого года или около того.

Solutions Collecting From Web of "Передача массива в виде аргументов, а не массива, в PHP"

Также обратите внимание, что если вы хотите применить метод экземпляра к массиву, вам необходимо передать функцию как:

 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 и передаете объект в качестве первого параметра.