php函数foo(数组$ arg = NULL) - 为什么数组和NULL?

时间:2010-08-20 19:46:03

标签: php function arguments kohana casting

我最近见过以下几次:

 function foo(array $arg = NULL) { ... }

我的问题是为什么在将$arg NULL投放到数组中时将其设为默认值?为什么不这样做:

 function foo(array $arg = array()) { ... }

我知道它并没有太大的区别 - 它主要只是阅读代码 - 但为什么鼓励PHP一直在改变数据类型。

我在Kohana看过很多。

6 个答案:

答案 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不是暗示类型的数组。

查看PHP type hinting page

如果符合以下条件,这非常有用:

$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作为默认参数,以便能够在函数内区分是否传递了某些内容,因为根据上面给出的示例,当没有指定任何内容时,函数的行为可能会有所不同。