Передача массива в качестве аргументов, а не массива, в PHP
Я, кажется, помню, что в PHP есть способ передать массив в виде списка аргументов для функции, разыменовывая массив в стандартный func($arg1, $arg2) порядке. Но теперь я не знаю, как это сделать. Я вспоминаю способ передачи по ссылке, как "Глоб" входящих параметров ... но не как удалить массив в список аргументов.
это может быть так же просто, как func(&$myArgs), но я уверен, что это не так. Но, к сожалению, php.net руководство ничего не разглашало так далеко. Не то чтобы мне приходилось использовать эту особенность в течение последнего года или около того.
4 ответов:
http://www.php.net/manual/en/function.call-user-func-array.php
call_user_func_array('func',$myArgs);
как уже было указано, начиная с PHP 5.6+ вы можете (должны!) используйте
...токен (он же "оператор splat", часть variadic функции функциональность) легко вызвать функцию с массивом аргументов:<?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
для методов, которые вы используете ReflectionMethod::invokeArgs и передать объект в качестве первого параметра.
Comments