PHP函数可选参数

133

我编写了一个可以接受10个参数的PHP函数,但只有2个是必需的。有时候,我想定义第8个参数,但不想为每个参数键入空字符串直到我到达第8个参数。

我想到的一个方法是传递一个带有数组参数的抽象函数,然后将其传递给真实函数。

是否有更好的方法来设置函数,以便只能传递我想要的参数?


4
相关链接:https://dev59.com/bXI95IYBdhLWcg3w3yFU - Pekka
很奇怪。 PHP中的内置函数可以有可选参数。那么为什么我们不能构建像那样的函数呢? - Rodrigo
6
请注意,许多这些答案已经过时... PHP现在支持具有可变长度参数列表的函数 - ashleedawg
16个回答

2

我知道这是一个老帖子,但我遇到了与楼主类似的问题,这就是我想出来的解决办法。

下面是你可以传递的数组示例。如果需要特定的顺序,你可以重新排序,但对于这个问题,这将达到所需的效果。

$argument_set = array (8 => 'lots', 5 => 'of', 1 => 'data', 2 => 'here');

这个技术很容易管理,易于阅读,并且数据提取点可以随时添加和删除而无需在任何编码中进行大量重写。我使用整数键来与OP的原始问题相匹配,但是字符串键同样易于使用。实际上,为了可读性,我建议使用字符串键。

将此内容放入外部文件以便于操作。

function unknown_number_arguments($argument_set) {

    foreach ($argument_set as $key => $value) {

        # create a switch with all the cases you need. as you loop the array 
        # keys only your submitted $keys values will be found with the switch. 
        switch ($key) {
            case 1:
                # do stuff with $value
                break;
            case 2:
                # do stuff with $value;
                break;
            case 3:
                # key 3 omitted, this wont execute 
                break;
            case 5:
                # do stuff with $value;
                break;
            case 8:
                # do stuff with $value;
                break;
            default:
                # no match from the array, do error logging?
                break;
        }
    }
return;
}

将此放置在文件开头。

$argument_set = array(); 

只需使用这些内容,根据数据来源进行编号/命名,以分配下一个数据片段。

$argument_set[1][] = $some_variable; 

最后,将数组传递。
unknown_number_arguments($argument_set);

2

0

PHP允许默认参数(链接)。在您的情况下,您可以将3到8个参数定义为NULL或空字符串"",具体取决于您的函数代码。这样,您就可以仅使用前两个参数调用函数。

例如:

<?php
  function yourFunction($arg1, $arg2, $arg3=NULL, $arg4=NULL, $arg5=NULL, $arg6=NULL, $arg7=NULL, $arg8=NULL){
echo $arg1;
echo $arg2;
if(isset($arg3)){echo $arg3;}
# other similar statements for $arg4, ...., $arg5
if(isset($arg8)){echo $arg8;}
}

有趣的想法...然而你的提议并没有解决问题。事实上,如果你添加关于被回显的参数的信息(例如通过使用 echo " this is arg3: " . $arg3; 等),你会发现调用例如 yourFunction(3, 2, $arg8=5); 将打印出 32 this is arg3: 5。问题在于,在 PHP 中传递可选参数时,参数位置仍然很重要...参数名称不足以将参数值映射到参数名称。 - mastropi

0

如果你通常只传递第8个值,你可以重新排列参数,使其成为第一个。你只需要指定参数,直到你想要设置的最后一个参数。

如果你使用不同的值,你有两个选择。

一种方法是创建一组包装函数,它们接受不同的参数并在其他参数上设置默认值。这对于只使用几个组合非常有用,但很快就会变得非常混乱。

另一个选择是传递一个数组,其中键是参数的名称。然后,你只需要检查数组中是否有一个带有键的值,如果没有,则使用默认值。但是,如果你有很多参数,这也可能变得混乱并添加很多额外的代码。


0

只需将 Null 设置为忽略您不想使用的参数,然后根据位置设置所需的参数。

 function myFunc($p1,$p2,$p3=Null,$p4=Null,$p5=Null,$p6=Null,$p7=Null,$p8=Null){
    for ($i=1; $i<9; $i++){
        $varName = "p$i";
        if (isset($$varName)){
            echo $varName." = ".$$varName."<br>\n";
        }
    }
}   

myFunc( "1", "2", Null, Null, Null, Null, Null, "eight" );

-4
func( "1", "2", default, default, default, default, default, "eight" );

1
这不是有效的PHP代码。default是PHP中的关键字 - Pang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接