传递 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_argfunc_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 参数与不传递参数完全相同的主要内容,如果未能解决你的问题,请参考以下文章

ThreadLocal父子线程数据传递解决方案

15. 值传递和引用传递

如何在文件之间重用相同的代码并选择在objective-c中传递参数?

传递默认参数值与根本不传递参数?

在活动之间传递参数 - null

传递给新窗口的JavaFX参数变为NULL [重复]