Передача массива в качестве аргументов, а не массива, в PHP
Я, кажется, помню, что в PHP есть способ передать массив в виде списка аргументов для функции, разыменовав массив стандартным способом func($arg1, $arg2)
. Но теперь я не знаю, как это сделать. Я вспоминаю способ передачи по ссылке, как "глобализировать" входящие параметры... но не как исключить массив из списка в список аргументов.
Это может быть так же просто, как func(&$myArgs)
, но я почти уверен, что это не так. Но, к сожалению, php.net руководство до сих пор ничего не разглашало. Нет что мне приходилось использовать эту конкретную функцию в течение последнего года или около того.
4 answers
Http://www.php.net/manual/en/function.call-user-func-array.php
call_user_func_array('func',$myArgs);
Как уже упоминалось, начиная с PHP 5.6+ вы можете (должны!) используйте токен ...
(он же "оператор splat", часть функциональности вариативных функций ), чтобы легко вызывать функцию с массивом аргументов:
<?php
function variadic($arg1, $arg2)
{
// Do stuff
echo $arg1.' '.$arg2;
}
$array = ['Hello', 'World'];
// 'Splat' the $array in the function call
variadic(...$array);
// 'Hello World'
Примечание: элементы массива сопоставляются аргументам по их должность в массиве, а не их ключи.
Согласно комментарию Карлоскаручче , эта форма распаковки аргументов является самым быстрым методом далеко во всех случаях. В некоторых сравнениях это более чем в 5 раз быстрее, чем call_user_func_array
.
В сторону
Потому что я думаю, что это действительно полезно (хотя и не имеет прямого отношения к вопросу): вы можете ввести параметр оператора splat в определении функции, чтобы убедиться, что все переданные значения соответствуют определенному типу.
(Просто помните, что для этого он ДОЛЖЕН быть последним параметром, который вы определяете, и что он объединяет все параметры, переданные в функция в массив.)
Это отлично подходит для проверки того, что массив содержит элементы определенного типа:
<?php
// Define the function...
function variadic($var, SomeClass ...$items)
{
// $items will be an array of objects of type `SomeClass`
}
// Then you can call...
variadic('Hello', new SomeClass, new SomeClass);
// or even splat both ways
$items = [
new SomeClass,
new SomeClass,
];
variadic('Hello', ...$items);
Также обратите внимание, что если вы хотите применить метод экземпляра к массиву, вам нужно передать функцию как:
call_user_func_array(array($instance, "MethodName"), $myArgs);
Для полноты картины, начиная с 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
Для методов, которые вы используете Метод отражения::вызовите вместо этого и передайте объект в качестве первого параметра.