2009-04-13 3 views
104

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

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

ответ

141
+1

Я мог бы поклясться, что это также не функциональность, как префиксный символ или что-то в этом роде. Благодарю. –

+1

Это, но не в PHP. В Python ;-) – vartec

+8

Но я не знаю Python! Я должен быть случайно психическим ...: D –

74

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

call_user_func_array(array($instance, "MethodName"), $myArgs); 
+4

@understack Пример '$ foo-> bar()' на [связанной странице] (http://www.php.net/ manual/en/function.call-user-func-array.php) предполагает, что он должен быть 'array ($ instance," MethodName ")'. –

+11

Awesome, я использовал это, чтобы избежать дублирования аргументов конструктора в дочернем классе :) 'call_user_func_array (array (parent," __construct "), func_get_args());' – Jason

9

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

+0

На самом деле это то, что я искал! – Dejv

65

As has been mentioned, по состоянию на PHP 5.6+ вы также можете использовать ... маркер (так называемый "знак оператора") как часть VARIADIC функциональных функций (see here for more info)

<?php 
$array = ['Hello', 'World']; 

function variadic($arg1, $arg2) 
{ 
    // Do stuff 
    echo $arg1.' '.$arg2; 
} 

// Splat $array in function call 
variadic(...$array); 

// Will echo 'Hello World' 

Примечание: элементы массива отображаются в аргументы по их позиции в массиве, а не их ключи.

EDIT

В соответствии с комментарием CarlosCarucce, в аргумент распаковки (как показано выше) является самым быстрым способом на сегодняшний день во всех случаях. В некоторых случаях это более чем в 5 раз быстрее, чем call_user_func_array.

ТАКЖЕ

Потому что я думаю, что это очень полезно (хотя и не напрямую связан с вопросом): вы можете type-hint the splat operator parameter в определении функции, чтобы убедиться, что все переданных значений соответствует определенный тип.

(Только помните, что делать это он MUST быть параметр последний вы определяете и что он связывает все параметры, передаваемые функции в массив.)

Это отлично подходит для убедившись, что массив содержит предметы определенного типа:

+5

Это отличное улучшение производительности над 'call_user_func_array'. Поэтому, если вы используете php 5.6+, я бы порекомендовал это. [Вот тест] (https://gist.github.com/nikic/6390366), который был указан в [официальной php wiki] (https://wiki.php.net/rfc/argument_unpacking) – CarlosCarucce

Смежные вопросы