У меня есть функция 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'])