我正在使用一个签名如下的函数
afunc(string $p1, mixed $p2, array $p3 [, int $p4 = SOM_CONST [, string $p5 ]] )
在某些情况下,我没有要传递的最后一个参数$p5
的数据,但为了保持一致性,我仍然希望传递类似NULL
的内容。所以我的问题是,PHP是否将传递NULL 完全与传递任何内容相同?
somefunc($p1, $p2, $p3, $p4 = SOM_CONST);
somefunc($p1, $p2, $p3, $p4 = SOM_CONST, NULL);
答案 0 :(得分:9)
没有。据推测,确切的签名是:
function afunc($p1, $p2, $p3, $p4 = SOM_CONST)
该功能使用func_get_arg
或func_get_args
$p5
。
func_num_args
会有所不同。如果我们这样做:
{
echo func_num_args();
}
然后
afunc(1,2,3,4,NULL);
和
afunc(1,2,3,4);
给5和4。
这取决于是否处理这些相同的功能。
答案 1 :(得分:7)
没有。如果参数的默认值为NULL
,则相同,否则为:
function a($a, $b, $c = 42) {
var_dump($c);
}
a(1, 2, NULL);
打印NULL
。
所以你不能说它总是一样的。 NULL
只是另一个值, 特殊。
更不用说非可选参数:调用a(1)
会给您一个错误(警告),但a(1,NULL)
有效。
答案 2 :(得分:5)
传递NULL
与完全与传递参数相同 - 如果默认值为NULL
,则func_num_args
函数的上下文除外:
返回传递的参数数量 这个功能。
<?php
function test($test=NULL) {
echo func_num_args();
}
test(); //outputs: 0
test(NULL); //outputs: 1
?>
答案 3 :(得分:1)
首先,您的函数签名不正确。在PHP中,强烈建议在所有非可选参数之后保留可选参数。
此时,如果您需要跳过某些可选参数,则可以提供NULL
作为其值,并且该函数将使用其默认值。这类似于在$x = $x ?? 12
中使用null合并运算符。仅当$x
时,此代码才会将12
设置为$x === NULL
。
此处甚至不应该提及使用带有func_num_args()
的参数个数,因为无论该参数的值是什么,如果在函数调用中传递一个参数,该函数都会注意到该参数。当涉及到函数的内部工作时,额外的NULL
参数与其他任何值一样好。您的代码可能需要一个参数NULL
才能执行某些任务。
唯一的特殊处理发生在使用NULL
参数填充可选函数参数时。