php -传递给函数的变量的动态数量

wh6knrhe  于 5个月前  发布在  PHP
关注(0)|答案(8)|浏览(50)

我正在寻找一种最优雅的方法来传递可变数量的参数来传递一个函数。
请考虑这样一个函数:

function abc ($x, $y, $l, $m) {
...
}

字符串
有没有一种不需要大量“ifs”或变量帕辛作为一个变量来调用函数的优雅方法:

all ($x, $y, $l, $m) arguments
first three ($x, $y, $l) arguments
first and third ($x, $l) arguments
only second ($y) argument
last two ($l, $m) arguments


还请多多指教。

pb3skfrl

pb3skfrl1#

我宁愿使用数组作为参数,并在函数内部检查它以查看变量是否存在:

function abc ($data) {

    if(isset($data['x']){
       //whatever
    }

    if(isset($data['y']){
       //whatever
    }

    ...
}

字符串

14ifxucb

14ifxucb2#

看看func_get_args()func_get_arg()func_num_args()
当然,当你使用这些参数时,你不可能只通过调用abc($x, $l)来获得“第一个”和“第三个”参数,你必须调用abc($x, null, $l)

klh5stk1

klh5stk13#

我最近需要一个函数来动态调用其他函数,并试图使一些最优雅和易于维护的东西。也许这种方法可以为谁而不是需要传递不同数量的参数到同一个函数寻找如何使用一种方式来调用任何所需的函数有用。

$return = call_user_func_array($function_name, $parameters);

字符串
在我的例子中,我传递了一个在Web服务中可用的函数,并为$parameters数组提供了每个函数所需的参数。
https://secure.php.net/manual/en/function.call-user-func-array.php

vi4fp9gy

vi4fp9gy4#

你是想说你想检查函数中设置了多少个变量吗?也许这能帮上忙

function abc($a) {
    $args = func_num_args();
    for($i = 0; $i < $args; $i++) {
        print_r(func_get_arg($i));   
    }
}
abc(1,2,3,4);

字符串

wfsdck30

wfsdck305#

// use **func_get_args** function to grab all arg passed in funcion
function variadic($a,$b) {
    $args = func_get_args();
    foreach ($args as $arg) {
        echo "$arg<br />\n";
    }
}

// pass as array 
$arg = array('a'=> $a,'a'=> $b)
function variadic($arg) 
{
   if(isset($arg[a]))
}

字符串

zengzsys

zengzsys6#

我想不出任何确切的替代方案,你的解决方案.要么你必须传递空的参数,你不想发送像abc (null, $y, null, $m)
或者是使用call_user_func_array,

$params = array('','y','','m');
 call_user_func_array('abc', $params);

字符串

erhoui1w

erhoui1w7#

function abc ($x=null, $y=null, $l=null, $m=null) {

}

字符串
然后你可以像这样调用函数:
所有($x,$y,$l,$m)参数
前三个($x,$y,$l)参数
第一个和第三个($x,null,$l)参数
只有第二个(null,$y)参数
最后两个(null,null,$l,$m)参数

rqmkfv5c

rqmkfv5c8#

function func1(...$params){
    
}

function func2(...$params){
    func1(...$params);
}

func2($x, $y, $z);

字符串
这种方式如预期的那样工作,您甚至可以通过引用传递参数。

相关问题