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

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

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

Ответ 2

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

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

Ответ 3

Как уже упоминалось, с PHP 5.6+ вы также можете использовать маркер ... (он же "оператор splat" ) как часть функциональности вариационных функций (см. здесь для дополнительной информации)

<?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.

также

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

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

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

<?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);

Ответ 4

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