PHP函数具有无限数量的参数

Age*_*eis 18 php arguments

如何编写可以接受无限数量参数的函数?

我想要做的是在一个包含以下内容的类中创建一个函数:

$stmt->bind_param('sssd', $code, $language, $official, $percent);
Run Code Online (Sandbox Code Playgroud)

Yac*_*oby 23

你看过func_get_args,func_get_argfunc_num_args了吗?

例如:

function foo(){
    if ( func_num_args() > 0 ){
        var_dump(func_get_args());
    }
}
Run Code Online (Sandbox Code Playgroud)

要么:

function bind_param(){
    if ( func_num_args() <= 1 ){
        return false; //not enough args
    }
    $format = func_get_arg(0)
    $args = array_slice(func_get_args(), 1)

    //etc
}
Run Code Online (Sandbox Code Playgroud)

编辑
关于Ewan Todds评论:
我没有任何关于你正在创建包装的基础API的知识,但另一种选择可能是用链接函数做一些事情,所以你的结果界面看起来像:

$var->bind()->bindString($code)
            ->bindString($language)
            ->bindString($official)
            ->bindDecimal($percent);
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用func_get_args作为代码可能更具可读性,更重要的是由于缺少格式变量而不太可能导致错误.


Sal*_*ali 13

以前你应该使用func_get_args(),但在PHP 5.6中,你可以使用...运算符.

因此,例如,您可以编写函数,该函数返回发送给函数的所有数字的总和:

function bind_param(...$params){
   var_dump($params);
}
Run Code Online (Sandbox Code Playgroud)

params实际上是所有元素的数组.


Fai*_*sal 7

如果您使用的是 PHP 5.6 或更高版本,参数列表可能包含...标记以表示该函数接受可变数量的参数。参数将作为数组传递给给定的变量;简单地使用...您可以访问无限的变量参数。

例如:

<?php
function sum(...$numbers) {
    $sum = 0;
    foreach ($numbers as $n) {
        $sum += $n;
    }
    return $sum ;
}

echo sum(1, 2, 3, 4, 5);
?>
Run Code Online (Sandbox Code Playgroud)

如果您使用的是PHP 版本 <= 5.5,那么您可以使用func_num_args()func_get_arg()func_get_args()函数访问无限参数。

例如:

<?php
function foo()
{
    $numargs = func_num_args();
    echo "Number of arguments: $numargs \n";
    if ($numargs >= 2) {
        echo "Second argument is: " . func_get_arg(1) . "\n";
    }
    $arg_list = func_get_args();
    for ($i = 0; $i < $numargs; $i++) {
        echo "Argument $i is: " . $arg_list[$i] . "\n";
    }
}

foo(1, 2, 3);
?>
Run Code Online (Sandbox Code Playgroud)


cle*_*tus 5

用途func_get_args():

function my_func() {
  $args = func_get_args();
  foreach ($args as $arg) {
    echo "Arg: $arg\n";
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 4

以上建议都不错,但我认为它们不适合您的情况。

$stmt->bind_param('sssd', $code, $language, $official, $percent);
Run Code Online (Sandbox Code Playgroud)

如果要包装此函数,则需要将对原始参数变量的引用传递给bind_param函数。我不认为 func_get_args() 给你这个,它给你值。因此不可能使用它们传递给父函数。在尝试扩展 mysqli_stmt 时,我遇到了类似的问题,但从未找到令人满意的解决方案。

恐怕这并不是对您问题的真正答案,只是警告其他参数可能不适用于您任意数量参数的特定应用。