参数数量不限的PHP函数

参数数量不限的PHP函数,php,arguments,Php,Arguments,如何编写一个可以接受无限数量参数的函数 我试图做的是在一个类中创建一个函数,该函数包含以下内容: $stmt->bind_param('sssd', $code, $language, $official, $percent); 你看过了吗 例如: function foo(){ if ( func_num_args() > 0 ){ var_dump(func_get_args()); } } 或: 与使用func_get_args相比,我更喜欢

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

我试图做的是在一个类中创建一个函数,该函数包含以下内容:

$stmt->bind_param('sssd', $code, $language, $official, $percent);
你看过了吗

例如:

function foo(){
    if ( func_num_args() > 0 ){
        var_dump(func_get_args());
    }
}
或:


与使用func_get_args相比,我更喜欢使用func_get_args,因为代码可能更可读,更重要的是,由于缺少格式变量,不太可能导致错误。

有一个名为的函数,它是传递给该函数的所有参数的数组

来自PHP.net的示例

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

foo(1, 2, 3);
函数foo()
{
$numargs=func_num_args();
echo“参数数量:$numargs
\n”; 如果($numargs>=2){ echo“第二个参数是:”.func\u get\u arg(1)。“
\n”; } $arg_list=func_get_args(); 对于($i=0;$i<$numargs;$i++){ echo“参数$i为:”.$arg_列表[$i]。“
\n”; } } foo(1,2,3);
上述示例将输出:

参数数量:3
第二个论点是:2
参数0是:1
论点1是:2
论点2是:3使用:


以上建议都很好,但我认为它们不适合你的情况

$stmt->bind_param('sssd', $code, $language, $official, $percent);
如果要包装此函数,需要将对原始参数变量的引用传递给bind_param函数。我不认为func_get_args()提供了这个,而是提供了值。因此,不可能使用这些函数传递给父函数。在尝试扩展mysqli_stmt时,我遇到了类似的问题,但始终没有找到令人满意的解决方案


恐怕这并不是对您问题的真正回答,只是警告您,其他参数可能无法在任意数量的参数的特定应用程序中工作。

在5个参数下,此设计开始显示反模式“”。这意味着重构被称为对象或结构,其中的数据成员表示要传入的参数。但是,要避免让它成为一个错误


另请参见refactoring.com上的重构。

对于非引用参数,使用func_get_args()的答案可以很好地使用。 然而,有一个技巧可以通过引用参数来进行传递。 而且,从技术上讲,它不是一个接受无限参数的函数,而是一个任意大的数,比如说100

您可以做的是定义一个接受大量参数的函数,并将它们默认为null。 然后,在该函数内部,将每个非空引用附加到一个数组,然后使用*call_user_func_array()*调用*bind_param()*

真正的诀窍是,你不想手写这东西。 只需编写另一个脚本,将这个函数的主体输出为*my_bind_param_body.php*。 然后,只需在主文件中定义函数的头,并将主体包含到该函数定义中。 i、 e


以前您应该使用
func\u get\u args()
,但在PHP5.6中,您可以使用

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

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

您的
参数实际上是所有元素的数组。

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

例如:

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

echo sum(1, 2, 3, 4, 5);
?>
<?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);
?>

如果您使用的是PHP版本
我经常使用func\u get\u参数。它很难一目了然地看到方法的输入是什么。另外,它在代码中引入了一段难看的语法。我建议这种方法只是作为最后的手段。我更喜欢参数对象重构。我同意你的观点,这是一种处理变量参数的糟糕方法。我在回答中添加了另一个想法,我更喜欢“链接函数”的建议,而不是func_get_args。我知道这个设计是一个流畅的界面。它通过使用bindString()、bindDecimal()等来完成。将“return$this;”作为它们的最后一行。FLUENT界面对于cetain类型的工厂来说是一个很好的选择。上次我检查时(1年多以前),没有办法包装/扩展
bind_param()
,因为
func_get_args()
不会返回引用。如果参数未设置,然后通过引用传递,将在函数内部设置,则这不起作用。func_get_args尝试访问引发错误的unset变量。如果不付出一些努力,您将无法做到这一点。我建议您以通常的方式构建查询,或者如果您希望不惜任何代价使用本机准备的语句,那么就转到PDO。他们有自己的价值,注意你想要的信息。不幸的是,与我自己编写简单的东西相比,PDO似乎有点过头了,需要更多的努力和样板。对于简单的东西,你可以使用我的userinfo中的库。不过很简单。
function my_bind_param(&$stmt, $types, &$arg1, &$arg2 = null, &$arg3 = null, ...)
{
    $vars = array($types);
    $vars[] = $arg1;

    if ($arg2 != null)
        $vars[] = &$arg2;
    if ($arg3 != null)
        $vars[] = &$arg3;
    ...

    if (!call_user_func_array(array($stmt, "bind_param"), $vars))
    {
        if ($stmt->errno == 0)
            return array(-1, "Unknown error binding parameters.");
        else
            return array(-1, "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error);
    }

    return array(0, "");
}
function my_bind_param(&$stmt, $types, &$arg1, &$arg2 = null, &$arg3 = null, ...)
{
    return include "my_bind_param_wrapper_body.php";
}
function bind_param(...$params){
   var_dump($params);
}
<?php
function sum(...$numbers) {
    $sum = 0;
    foreach ($numbers as $n) {
        $sum += $n;
    }
    return $sum ;
}

echo sum(1, 2, 3, 4, 5);
?>
<?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);
?>