传递NULL参数与传递无参数完全相同

时间:2011-01-01 08:45:48

标签: php function parameters parameter-passing optional-parameters

我正在使用一个签名如下的函数

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);

4 个答案:

答案 0 :(得分:9)

没有。据推测,确切的签名是:

function afunc($p1, $p2, $p3, $p4 = SOM_CONST)

该功能使用func_get_argfunc_get_args $p5

根据您是否传递NULL,

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参数填充可选函数参数时。