代码之家  ›  专栏  ›  技术社区  ›  Darryl Hein IrishChieftain

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

  •  9
  • Darryl Hein IrishChieftain  · 技术社区  · 14 年前

    最近我见过以下几次:

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

    我的问题是为什么要违约 $arg NULL 它什么时候会被扔进一个数组?为什么不这样做:

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

    我在科哈纳见过很多。

    6 回复  |  直到 14 年前
        1
  •  7
  •   Colin Hebert    14 年前

    真正的问题是为什么要在不需要数组的时候创建数组。

    如果使用$arg=array(),则会有一条特定的指令来创建数组,即使是PHP指令,该指令仍会占用CPU周期。如果只执行$arg=NULL,则不会执行任何操作。

        2
  •  4
  •   Daniel Vandersluis    14 年前

    NULL 参数的值是可接受的(如果数组或显式 无效的 --未给出)。

    array 函数签名中的规范不是关于强制转换,而是 type hint . 它说只接受数组 $arg .

        3
  •  2
  •   Peter Ajtai    14 年前

    =NULL 是一种允许参数值为NULL的方法:

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

    允许执行 foo($bar); $bar === NULL .

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

    如果 $bar===空

    看一看这个 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

        4
  •  1
  •   Teekin    14 年前

    原因可能是要区分要处理的对象的空集合,以及在不放入任何对象时略有不同的功能。

    作为一个假设的例子,假设您有一个为用户创建报告的函数。输入数组包含要为其生成报告的用户的id(甚至对象)。当您需要处理所有用户时,也可以使用相同的函数来处理报告,而不是处理一组特定的用户。当您只想为特定的用户进行处理时,您将抛出数组。但是,如果您想处理所有这些参数,那么参数应该是一个明显的NULL,而不是一个“no users”(空数组)。

    例如,假设有一个页面,管理员可以在其中指定要为哪些用户创建报告。但是管理员在没有选择任何用户的情况下按下“Create Reports”按钮,在这种情况下,一个空数组将被抛出到函数中,函数将准确地处理no users,因为数组中没有用户。

    那么在这个假设的系统中,您可能在其他地方有一个不同的按钮,“createallreports”,在这种情况下,您不会抛出任何内容,函数将能够区分“number of users=0”和“usersnotprovided”,在这种情况下,这意味着“All users”。

    这就是一个例子。通常,我使用NULL作为默认参数,以便能够在函数中区分是否传递了某些内容,因为在没有指定任何特定内容时,函数的行为可能会有所不同,如上面给出的示例所示。

        5
  •  1
  •   Tomas    11 年前

    我知道这是几年前的事了,但我忍不住要说选择了错误的答案,没有人清楚地回答完整的问题。所以对于其他正在研究这个问题并想知道这里到底发生了什么的人来说:

    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){ ... }
    
        6
  •  0
  •   pleasedontbelong    14 年前

    foo(array());
    

    foo();
    

    那你就得用 $arg = NULL