Как передать переменное число аргументов в функцию PHP - PullRequest
109 голосов
/ 14 сентября 2009

У меня есть функция PHP, которая принимает переменное число аргументов (используя func_num_args() и func_get_args()), но количество аргументов, которые я хочу передать функции, зависит от длины массива. Есть ли способ вызвать функцию PHP с переменным числом аргументов?

Ответы [ 9 ]

124 голосов
/ 14 сентября 2009

Если у вас есть аргументы в массиве, вас может заинтересовать функция call_user_func_array.

Если количество аргументов, которые вы хотите передать, зависит от длины массива, это, вероятно, означает, что вы можете сами упаковать их в массив - и использовать этот аргумент для второго параметра call_user_func_array.

Элементы этого массива, который вы передаете, будут приниматься вашей функцией как отдельные параметры.


Например, если у вас есть эта функция:

function test() {
  var_dump(func_num_args());
  var_dump(func_get_args());
}

Вы можете упаковать свои параметры в массив, например так:

$params = array(
  10,
  'glop',
  'test',
);

И затем вызвать функцию:

call_user_func_array('test', $params);

Этот код будет выводить:

int 3

array
  0 => int 10
  1 => string 'glop' (length=4)
  2 => string 'test' (length=4)

т.е. 3 параметра; точно так же, как если бы функция была названа так:

test(10, 'glop', 'test');
55 голосов
/ 27 января 2014

Это теперь возможно с PHP 5.6.x , используя оператор ... (также известный как оператор splat в некоторых языках):

Пример:

function addDateIntervalsToDateTime( DateTime $dt, DateInterval ...$intervals )
{
    foreach ( $intervals as $interval ) {
        $dt->add( $interval );
    }
    return $dt;
}

addDateIntervaslToDateTime( new DateTime, new DateInterval( 'P1D' ), 
        new DateInterval( 'P4D' ), new DateInterval( 'P10D' ) );
42 голосов
/ 19 апреля 2014

В новой Php 5.6 вы можете использовать ... operator вместо func_get_args().

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

function manyVars(...$params) {
   var_dump($params);
}
35 голосов
/ 10 декабря 2015

Поскольку PHP 5.6 , список переменных можно указать с помощью оператора ....

function do_something($first, ...$all_the_others)
{
    var_dump($first);
    var_dump($all_the_others);
}

do_something('this goes in first', 2, 3, 4, 5);

#> string(18) "this goes in first"
#>
#> array(4) {
#>   [0]=>
#>   int(2)
#>   [1]=>
#>   int(3)
#>   [2]=>
#>   int(4)
#>   [3]=>
#>   int(5)
#> }

Как видите, оператор ... собирает список переменных аргументов в массиве.

Если вам нужно передать аргументы переменной в другую функцию, ... все равно может вам помочь.

function do_something($first, ...$all_the_others)
{
    do_something_else($first, ...$all_the_others);
    // Which is translated to:
    // do_something_else('this goes in first', 2, 3, 4, 5);
}

Поскольку PHP 7 , список переменных может быть принудительно равен all того же типа.

function do_something($first, int ...$all_the_others) { /**/ }
10 голосов
/ 17 января 2014

Для тех, кто ищет способ сделать это с $object->method:

call_user_func_array(array($object, 'method_name'), $array);

Мне это удалось в конструктивной функции, которая вызывает переменную method_name с переменными параметрами.

4 голосов
/ 14 сентября 2009

Вы можете просто позвонить.

function test(){        
     print_r(func_get_args());
}

test("blah");
test("blah","blah");

Выход:

Array ([0] => бла) Массив ([0] => бла [1] => бла)

2 голосов
/ 02 марта 2016

Я удивлен, что никто здесь не упомянул просто прохождение и извлечение массива. Например:

function add($arr){
    extract($arr, EXTR_REFS);
    return $one+$two;
}
$one = 1;
$two = 2;
echo add(compact('one', 'two')); // 3

Конечно, это не обеспечивает проверки аргумента . Для этого любой может использовать мою функцию ожидаемого: https://gist.github.com/iautomation/8063fc78e9508ed427d5

1 голос
/ 02 февраля 2015

Старый вопрос, я знаю, однако, ни один из ответов здесь действительно не справляется с задачей просто ответить на вопрос.

Я просто поиграл с php, и решение выглядит так:

function myFunction($requiredArgument, $optionalArgument = "default"){
   echo $requiredArgument . $optionalArgument;
}

Эта функция может делать две вещи:

Если вызывается только с обязательным параметром: myFunction("Hi") Будет напечатано «Привет по умолчанию»

Но если он вызывается с необязательным параметром: myFunction("Hi","me") Будет напечатано «Привет мне»;

Я надеюсь, что это поможет любому, кто ищет это в будущем.

0 голосов
/ 27 марта 2014

Вот решение с использованием магического метода __invoke

(доступно с версии 5.3)

class Foo {
    public function __invoke($method=null, $args=[]){
        if($method){
            return call_user_func_array([$this, $method], $args);
        }
        return false;
    }

    public function methodName($arg1, $arg2, $arg3){

    }
}

Изнутри того же класса:

$this('methodName', ['arg1', 'arg2', 'arg3']);

Из экземпляра объекта:

$obj = new Foo;
$obj('methodName', ['arg1', 'arg2', 'arg3'])
...