Как передать переменное количество аргументов функции PHP

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

Если у вас есть аргументы в массиве, вас может заинтересовать функция 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'); 

Теперь это возможно с помощью 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' ) ); 

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

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

 function manyVars(...$params) { var_dump($params); } 

Начиная с 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 переменный список аргументов может быть принудительно одинаковым.

 function do_something($first, int ...$all_the_others) { /**/ } 

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

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

Я был успешным с этим в функции построения, которая вызывает переменную method_name с переменными параметрами.

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

 function test(){ print_r(func_get_args()); } test("blah"); test("blah","blah"); 

Вывод:

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

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

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

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

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

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

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

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

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

 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

Вот решение, использующее магический метод __invoke

(Доступно с php 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'])