我最近见过以下几次:
function foo(array $arg = NULL) { ... }
我的问题是为什么在将$arg
NULL
投放到数组中时将其设为默认值?为什么不这样做:
function foo(array $arg = array()) { ... }
我知道它并没有太大的区别 - 它主要只是阅读代码 - 但为什么鼓励PHP一直在改变数据类型。
我在Kohana看过很多。
答案 0 :(得分:7)
真正的问题是为什么在不需要时创建数组。
如果使用$ arg = array(),则会有一条特定的指令来创建一个数组,即使它是PHP的指令仍然消耗CPU周期。如果你只是做$ arg = NULL,那么什么都不做。
答案 1 :(得分:4)
我的猜测是他们想要一个参数数组,但参数的NULL
值是可以接受的(默认情况下,如果数组 - 或显式NULL
- 将使用 - 没有给出。)
请注意,函数签名中的array
规范与转换无关,而是type hint。它表示$arg
只接受数组。
答案 2 :(得分:2)
=NULL
是一种允许参数值为NULL的方法:function foo(array $arg = NULL) { ... }
允许在foo($bar);
的情况下执行$bar === NULL
。
function foo(array $arg = array()) { ... }
如果$bar === NULL
,将触发错误,因为NULL不是暗示类型的数组。
如果符合以下条件,这非常有用:
$bar = NULL;
// Do stuff that may involve $bar
// $bar may be an array, or it may still be NULL
foo($bar);
// For the above line to not trigger an error if $bar === NULL, you must use
function foo(array $arg = NULL) { ... }
除非this error,否则获得do this。
答案 3 :(得分:1)
我知道这已经有几年了,但是我不禁要说选择了错误的答案,并没有人清楚地回答完整的问题。所以对于那些正在关注这个问题的人并想知道这里到底发生了什么:
function foo(array $arg = NULL) { ... }
当你调用foo()时,第一件事就是PHP将测试$ arg以查看它是否是一个数组。没错,数组$ arg是一个测试。如果$ arg不是数组,您将看到此错误:
如果$ arg是一个字符串:
Catchable fatal error: Argument 1 passed to foo() must be an array, string given
好吧,那么NULL只是意味着如果没有传递$ arg,我们将它设置为NULL。这只是让$ arg可选或预设其值的一种方法。
为了清楚起见,没有使用RFC补丁here就没有类型转换函数参数。
如果您使用RFC补丁,则可以执行以下操作:
function foo((array)$arg){ ... }
答案 4 :(得分:0)
也许如果你的foo函数在使用空数组显式调用函数时必须做某事...我的意思是:
如果
foo(array());
与
不同foo();
然后你必须使用$arg = NULL
答案 5 :(得分:0)
原因可能是要区分要处理的空对象集,以及放入任何内容时稍微不同的功能。
作为一个假设的例子,假设您有一个为用户创建报告的功能。输入数组包含要为其生成报告的用户的ID(或甚至对象)。当您需要处理所有用户时,相同的功能也可用于处理报告,而不是某些用户。当您只想处理特定用户时,您会抛出数组。但是如果你想处理所有这些,那么参数是一个明显的NULL而不是“无用户”,这将是一个空数组。
例如,假设有一个页面,管理员可以指定要为其创建报告的用户。但管理员按下“创建报告”按钮而不选择任何用户,在这种情况下,一个空数组将被抛入该函数,并且该函数将准确地处理没有用户,因为数组中没有用户。
那么也许你可能在这个假设系统的其他地方有一个不同的按钮,“创建所有报告”,在这种情况下你不会扔任何东西,并且该功能将能够区分“用户数量” = 0“和”未提供用户“,在这种情况下将表示”所有用户“。
这是一个例子。通常,我使用NULL作为默认参数,以便能够在函数内区分是否传递了某些内容,因为根据上面给出的示例,当没有指定任何内容时,函数的行为可能会有所不同。