Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将可变数量的参数传递给PHP函数_Php_Variadic Functions - Fatal编程技术网

如何将可变数量的参数传递给PHP函数

如何将可变数量的参数传递给PHP函数,php,variadic-functions,Php,Variadic Functions,我有一个PHP函数,它接受可变数量的参数(使用func\u num\u args()和func\u get\u args()),但我要传递函数的参数数量取决于数组的长度。有没有一种方法可以调用参数个数可变的PHP函数?如果数组中有参数,那么函数可能会感兴趣 如果要传递的参数数量取决于数组的长度,这可能意味着您可以将它们本身打包到一个数组中,并将其用于call\u user\u func\u array的第二个参数 然后,您传递的数组元素将作为不同的参数被函数接收 例如,如果您具有此功能: fu

我有一个PHP函数,它接受可变数量的参数(使用
func\u num\u args()
func\u get\u args()
),但我要传递函数的参数数量取决于数组的长度。有没有一种方法可以调用参数个数可变的PHP函数?

如果数组中有参数,那么函数可能会感兴趣

如果要传递的参数数量取决于数组的长度,这可能意味着您可以将它们本身打包到一个数组中,并将其用于
call\u user\u func\u array
的第二个参数

然后,您传递的数组元素将作为不同的参数被函数接收


例如,如果您具有此功能:

function test() {
  var_dump(func_num_args());
  var_dump(func_get_args());
}
call_user_func_array('test', $params);
您可以将参数打包到数组中,如下所示:

$params = array(
  10,
  'glop',
  'test',
);
然后,调用函数:

function test() {
  var_dump(func_num_args());
  var_dump(func_get_args());
}
call_user_func_array('test', $params);
此代码将显示输出:

int 3

array
  0 => int 10
  1 => string 'glop' (length=4)
  2 => string 'test' (length=4)
即3个参数;与iof完全相同,函数是这样调用的:

test(10, 'glop', 'test');
你可以叫它

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

test("blah");
test("blah","blah");
输出:

Key: arg1 Arg: foo
Key: arg2 Arg: bar

数组([0]=>blah)数组([0]=>blah[1]=>blah)

对于那些想用
$object->method
实现这一点的人:

call_user_func_array(array($object, 'method_name'), $array);
我在一个构造函数中成功地实现了这一点,该函数使用变量参数调用变量方法名称。

现在,使用。。。运算符(在某些语言中也称为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.3开始提供)

来自同一类内部:

$this('methodName', ['arg1', 'arg2', 'arg3']);
从对象的实例:

$obj = new Foo;
$obj('methodName', ['arg1', 'arg2', 'arg3'])
在新的中,您可以使用
。。。运算符
而不是使用
func\u get\u args()

因此,使用它,您可以获得您传递的所有参数:

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

然而,我知道这是一个老问题,这里没有一个答案能很好地回答这个问题

我刚刚使用了php,解决方案如下所示:

function myFunction($requiredArgument, $optionalArgument = "default"){
   echo $requiredArgument . $optionalArgument;
}
此函数可以做两件事:

如果仅使用所需参数调用它:
myFunction(“Hi”)
它将打印“Hi默认值”

但是如果使用可选参数调用它:
myFunction(“Hi”、“me”)
它将打印“嗨,我”


我希望这有助于任何人谁是寻找这条路

由于PHP5.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);
}

由于php7,参数的变量列表也可以强制为同一类型的all

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

我很惊讶这里没有人提到简单地传递和调用数组。例如:

function add($arr){
    extract($arr, EXTR_REFS);
    return $one+$two;
}
$one = 1;
$two = 2;
echo add(compact('one', 'two')); // 3
当然,这并没有提供。
因此,任何人都可以使用我的expect函数:

我想知道,我找不到关于将命名参数与变量参数组合使用的可能性的文档。因为我尝试了这段代码,我很惊讶,它居然有效:

function myFunc(...$args) {
    foreach ($args as $key => $arg) {
        echo "Key: $key Arg: $arg <br>";
    }
}
echo myFunc(arg1:"foo", arg2:"bar");

在我看来,这很酷。

如果我正确理解OP,问题不在于接收参数,而在于使用可变数量的参数调用函数。那么,我没有正确理解OP。那么,阵列肯定是最好的选择。然后,他可以直接将数组传递到test(),不?传递数组也可能是一个解决方案,事实上——如果我理解正确的话^^旧问题,但仅供参考,数组可以很好地工作,但是传递实际参数可以让您使用PHP的默认值作为空参数,这样就省去了大量检查数组是否包含特定值的麻烦。是的,谢谢。call_user_func_array()正是我要找的函数。可以将call_user_func_array()与对象方法调用一起使用吗?@nohat:不客气:-);;关于使用对象的方法:是的,您可以,使用类似array($obj,'methodName')的东西作为第一个参数;;实际上,您可以将任何“回调”传递给该函数。有关回调的更多信息,请参见此处的更多信息:@fracz link中,OP正在尝试创建一个“可变函数”。请查看我的答案,了解新php5.6中的splat运算符:这基本上是使用2009年最热门投票答案中所述的
call_user_func_array
。也许有必要在它周围包装一个额外的
\u调用
,但我看不出来。你没有理解这个问题。OP询问了一些他不必在函数签名中明确定义的参数,但他仍然可以将值作为参数传递给函数。例如,函数签名没有定义任何参数(可选或不可选),但当OP需要时,可以向函数发送45个不同的值作为参数。类型化变量参数列表是PHP7中引入的一项功能。您还可以使用
$object->method_name(…$array)更进一步,如果要通过引用传递,请使用
$object->method\u name(&…$args)