在PHP中,如果我有一个像这样写的函数
function example($argument1, $argument2="", $argument3="")
我可以在其他地方调用此功能
example($argument1)
但是如果我想给thrid参数赋予一些价值, 我应该这样做吗
example($argument1, "", "test");
或者
example($argument1, NULL, "test");
我认为两者都有效,但更好的方法是什么?因为将来如果在main函数中更改$ argument2的值并且如果我有“”,那么会有任何问题吗?或者NULL是最好的选择吗?
由于
答案 0 :(得分:15)
为您不想指定的参数传递null
或""
仍然会导致传递给函数的那些空值和空字符串。
使用参数默认值的唯一情况是调用代码中的参数是NOT SET ALL。 example('a')
会让args#2和#3获得默认值,但是如果你执行example('a', null, "")
那么arg#3为null并且arg#3是函数中的空字符串,而不是默认值。
理想情况下,PHP会支持像example('a', , "")
这样的东西来允许将默认值用于arg#2,但这只是一个语法错误。
如果你需要在函数调用中间保留参数但是为后面的参数指定值,你必须在函数本身中显式检查一些sentinel值并自己设置默认值。
以下是一些示例代码:
<?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,该值就会传递给函数并覆盖函数定义中设置的默认值。
答案 1 :(得分:11)
您可以使用:
example($argument1, '', 'test');
或者
example($argument1, NULL, 'test');
您始终可以使用而不是空字符串来检查NULL:
if ($argument === NULL) {
//
}
我认为这完全取决于使用args在函数内部发生的事情。
答案 2 :(得分:1)
如果您在函数定义中将可选参数定义为null
并保持这种方式,我认为您会得到更好的服务,因此将它们称为example($argument1, NULL, $argument="test")
。只需确保如何在函数本身中使用null'd参数来不引发任何警告。只要您确定如何在函数本身中使用该参数,您也可以使用false
。
如果您似乎有很多问题,更好的方法是使用单个关联数组作为变量选项:
function example($optionsIn = array()) {
$options = array(
'var1' => null,
'var2' => 'something',
'var3' => 'else'
) ;
$options = array_merge($options, $optionsIn) ;
}
$options = array(
'var2' => 'different'
) ;
example($options) ;
这样你就可以传入你想要的任何函数参数,留下任何其他参数,并确保在函数中定义了适当的默认值。
唯一的缺点是预期的参数对函数签名是隐藏的,但您可以在函数的docblock中记录它们。
答案 3 :(得分:0)
这取决于功能的特殊性。
function a($b=true,$c=false){
echo $b?'true':'false';
}
执行
a(NULL, 1);
结果: false 。但只是a()结果: true
这意味着您需要默认参数,那么您应该使用默认值:
a(true, 1);