传递 NULL 参数与不传递参数完全相同
Posted
技术标签:
【中文标题】传递 NULL 参数与不传递参数完全相同【英文标题】:Is passing NULL param exactly the same as passing no param 【发布时间】:2011-06-02 04:41:57 【问题描述】:我正在使用一个签名看起来像这样的函数
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);
【问题讨论】:
是的,它们是相同的,因为如果什么都不传递,则不会分配内存。 函数签名的文档在哪里,它的用途是什么 【参考方案1】:首先,您的函数签名不正确。强烈建议在 PHP 中将可选参数保留在所有非可选参数之后。
此时,如果你需要跳过一些可选参数,你可以提供NULL
作为它们的值,函数将使用它们的默认值。这将类似于在$x = $x ?? 12
中使用空合并运算符。仅当$x === NULL
时,此代码才会将$x
设置为12
。
使用func_num_args()
的参数数量在这里甚至不应该被提及,因为无论参数的值是什么,如果您在函数调用中传递一个参数,那么该参数将被函数注意到。当涉及到函数的内部工作时,额外的NULL
参数与任何其他值一样好。您的代码可能需要一个参数为 NULL
才能执行某些任务。
唯一的特殊处理发生在可选函数参数填充有NULL
参数时。
【讨论】:
【参考方案2】:没有。只有参数的默认值为NULL
时才相同,否则不是:
function a($a, $b, $c = 42)
var_dump($c);
a(1, 2, NULL);
打印NULL
。
所以你不能说它总是一样的。 NULL
只是另一个值,它并不是那个特殊的。
更不用说非可选参数了:调用a(1)
会给你一个错误(警告),但a(1,NULL)
有效。
【讨论】:
是的,现在我有了功能,例如。 doSomething ($a=1, $b=2) $arr=array($a, $b);如果我调用 doSomething(15) 它会产生结果 (15,2)。如果我调用 doSomething(15, null),我将得到结果 (15,NULL)。问题是当我只需要在更复杂的函数上设置第二个(或第三个、第四个等)参数时,比如 doSomething(, 30) 这在 php 中是不可能的。它必须设置为null,然后在函数中必须使用合并运算符。【参考方案3】:传递NULL
完全与不传递参数相同 - 如果默认值为 NULL
,除非在 func_num_args
函数的上下文中:
返回传递的参数个数 到函数。
<?php
function test($test=NULL)
echo func_num_args();
test(); //outputs: 0
test(NULL); //outputs: 1
?>
【讨论】:
强调 "如果默认值为 NULL"(Matthew's answer 涵盖相反的情况) preg_match() 中的 &$matches 这样的函数通过引用传递也是不同的【参考方案4】:没有。据推测,确切的签名是:
function afunc($p1, $p2, $p3, $p4 = SOM_CONST)
该函数使用func_get_arg
或func_get_args
作为$p5
。
func_num_args
会有所不同,具体取决于您是否传递 NULL。如果我们这样做:
echo func_num_args();
然后
afunc(1,2,3,4,NULL);
和
afunc(1,2,3,4);
给出 5 和 4。
由函数决定是否处理这些。
【讨论】:
使用 PHP 函数的真实示例:substr($str, 1)
与 substr($str, 1, null)
。 - "如果给定长度并且为 0、FALSE 或 NULL,将返回一个空字符串。"以上是关于传递 NULL 参数与不传递参数完全相同的主要内容,如果未能解决你的问题,请参考以下文章