Передача массива как аргумента, а не массива в PHP - PullRequest
138 голосов
/ 13 апреля 2009

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

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

Ответы [ 4 ]

164 голосов
/ 13 апреля 2009
114 голосов
/ 02 декабря 2015

Как уже упоминалось , начиная с PHP 5.6+ вы можете (должны!) Использовать токен ... (он же «оператор сплат»), часть функций 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);
81 голосов
/ 13 апреля 2009

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

call_user_func_array(array($instance, "MethodName"), $myArgs);
10 голосов
/ 18 февраля 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...