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 默认参数的主要内容,如果未能解决你的问题,请参考以下文章