php 默认参数

Posted

技术标签:

【中文标题】php 默认参数【英文标题】:php default arguments 【发布时间】:2011-08-23 13:28:49 【问题描述】:

php 中,如果我有这样写的函数

function example($argument1, $argument2="", $argument3="")

我可以像这样在其他地方调用这个函数

example($argument1)

但是如果我想给第三个参数一些价值, 我应该这样做吗

example($argument1, "", "test");

或者

 example($argument1, NULL, "test");

我认为两者都可以,但是更好的方法是什么?因为将来如果在主函数中更改 $argument2 的值并且如果我有“”,那么会有什么问题吗?还是 NULL 是最好的选择?

谢谢

【问题讨论】:

你的最后两个代码块应该是example($argument1, "", "test");example($argument1, NULL, "test"); 【参考方案1】:

为不想指定的参数传递 null"" 仍会导致将这些 null 和空字符串传递给函数。

唯一使用参数默认值的情况是调用代码中的参数未设置全部。 example('a') 会让 args #2 和 #3 获得默认值,但如果你这样做 example('a', null, "") 则 arg #3 为 null 并且 arg #3 是函数中的空字符串,而不是默认值。

理想情况下,PHP 将支持 example('a', , "") 之类的东西,以允许将默认值用于 arg #2,但这只是语法错误。

如果您需要在函数调用中间省略参数但为后面的参数指定值,则必须显式检查函数本身中的某些标记值并自行设置默认值。


这里有一些示例代码:

<?php

function example($a = 'a', $b = 'b', $c = 'c') 
        var_dump($a);
        var_dump($b);
        var_dump($c);

对于各种输入:

example():
string(1) "a"
string(1) "b"
string(1) "c"

example('z'):
string(1) "z"
string(1) "b"
string(1) "c"

example('y', null):
string(1) "y"
NULL
string(1) "c"

example('x', "", null):
string(1) "x"
string(0) ""
NULL

请注意,只要您在函数调用中为参数指定了 ANYTHING,该值就会传递给函数并覆盖函数定义中设置的默认值。

【讨论】:

但是如果你做 example('a', null, "") 那么 arg #3 是 null 并且 arg #3 是函数中的一个空字符串,而不是默认值 - 所以你说如果实际函数更改为具有不同的值,则调用者也需要更改。在这种情况下,调用者中的 NULL 有帮助吗? 我在您的不同评论中看到了这个问题的答案。所以我不能使用 NULL 是的,您可以简单地在调用中传入默认值,但是如果您需要更改默认值,则必须在使用它的任何地方更改函数调用。您最好使用下面 Fanis 的答案,它使用数组来指定参数。 谢谢。我现在将无法使用数组方法,因为它涉及一些更改..所以我猜我只是将 $argument2 的默认值作为 "" 现在假设 $argument 2 的默认值在 main功能不变。【参考方案2】:

你可以使用:

example($argument1, '', 'test');

或者

example($argument1, NULL, 'test');

您始终可以使用而不是空字符串来检查 NULL:

if ($argument === NULL) 
    //

我认为这完全取决于带有 args 的函数内部发生的情况。

【讨论】:

MarcB 的回答比这个更合适。您不能像这样使用它们并获得预期的结果。 @Octopus 为什么 OP 不能使用这个?我和MarcB一样吗? “您必须明确检查函数本身中的某些标记值”【参考方案3】:

我认为如果您在函数定义中将可选参数定义为null 并保持这种方式,那么您将得到更好的服务,从而将它们称为example($argument1, NULL, $argument="test")。只需确定如何在函数本身中使用 null 参数,以免引发任何警告。您也可以使用false,只要您确定如何在函数本身中使用该参数即可。

如果您似乎经常遇到这个问题,更好的方法可能是对变量选项使用单个关联数组:

function example($optionsIn = array()) 

    $options = array(
        'var1' => null,
        'var2' => 'something',
        'var3' => 'else'
    ) ;

    $options = array_merge($options, $optionsIn) ;



$options = array(
    'var2' => 'different'
) ;

example($options) ;

这样您就可以传入任何您希望的函数参数,而无需其他任何参数,并确保在函数中定义了适当的默认值。

唯一的缺点是函数签名中隐藏了预期的参数,但您可以在函数的文档块中记录它们。

【讨论】:

使用关联数组似乎是个好主意,但您必须小心不要过度使用它,因为它会混淆您在函数中发送/接收的参数。您还可以依赖 setters 获取可选参数。 @Jeff 绝对。错别字也是一个问题,我一直在通过定义常量来解决这个问题,例如,对于将被其他人使用的核心函数:它可能很难看,但输入$options[OPT_URL] 是万无一失的,而且您还可以从现代 IDE 获得自动完成帮助。 【参考方案4】:

这取决于功能的规格。

function a($b=true,$c=false)
 echo $b?'true':'false';
 

执行

 a(NULL, 1);

结果:错误。但只是 a() 结果:true

这意味着您需要默认参数,那么您应该使用默认参数:

 a(true, 1);

【讨论】:

以上是关于php 默认参数的主要内容,如果未能解决你的问题,请参考以下文章

061-PHP函数定义默认参数

PHP 默认参数函数调用

php函数中,多个参数的情况下怎么使其中一个参数为默认值而其他的使用指定值

PHP:函数参数的动态默认值

PHP 引用参数和默认 null

PHP - 使用大量参数和默认值初始化对象的最佳方法