У меня есть функция PHP, которая принимает переменное количество аргументов (используя func_num_args()
и func_get_args()
), но количество аргументов, которые я хочу передать, зависит от длины массива. Есть ли способ вызвать функцию PHP с переменным числом аргументов?
Как передать переменное количество аргументов функции PHP
Ответ 1
Если у вас есть аргументы в массиве, вас может заинтересовать функция 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');
Ответ 2
Теперь это возможно с помощью 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' ) );
Ответ 3
В новом Php 5.6 вы можете использовать ... operator
вместо func_get_args()
.
Итак, используя это, вы можете получить все параметры, которые вы передаете:
function manyVars(...$params) {
var_dump($params);
}
Ответ 4
Так как 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) { /**/ }
Ответ 5
Для тех, кто ищет способ сделать это с помощью $object->method
:
call_user_func_array(array($object, 'method_name'), $array);
Мне удалось с этим справиться в функции построения, которая вызывает переменную method_name с переменными параметрами.
Ответ 6
Вы можете просто вызвать его.
function test(){
print_r(func_get_args());
}
test("blah");
test("blah","blah");
Вывод:
Массив ([0] = > blah) Массив ([0] = > blah [1] = > blah)
Ответ 7
Старый вопрос, я знаю, однако, ни один из ответов здесь действительно не помогает просто ответить на вопрос.
Я просто играл с php, и решение выглядит так:
function myFunction($requiredArgument, $optionalArgument = "default"){
echo $requiredArgument . $optionalArgument;
}
Эта функция может выполнять две функции:
Если его вызвать только с требуемым параметром: myFunction("Hi")
Он будет печатать "Привет по умолчанию"
Но если он вызывается с дополнительным параметром: myFunction("Hi","me")
Он будет печатать "Привет, я";
Я надеюсь, что это поможет любому, кто ищет это в будущем.
Ответ 8
Я удивлен, что никто здесь не упомянул просто прохождение и extract в массиве. Например:
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
Ответ 9
Вот решение, использующее магический метод __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'])