【问题标题】:php function foo(array $arg = NULL) -- why the array and NULL?php function foo(array $arg = NULL) -- 为什么数组和NULL?
【发布时间】:2011-04-01 20:26:48
【问题描述】:

我最近几次看到以下内容:

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

我的问题是为什么将 $arg NULL 设为默认值,而它只是被强制转换为数组?为什么不这样做:

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

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

我在 Kohana 经常看到这种情况。

【问题讨论】:

  • $arg不会被强制转换为 array()。如果没有提供参数,它将在 foo 中为 null
  • 啊!我现在明白了!谢谢大家!

标签: php function arguments kohana casting


【解决方案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){ ... }

【讨论】:

    【解决方案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】:

      我的猜测是他们想要一个参数数组,但参数的 NULL 值是可以接受的(如果未给出数组 - 或显式 NULL - 默认情况下将使用该值)。

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

      【讨论】:

      • 没有。 = NULL= array() 都不允许参数,但只有 =NULL 允许参数为 NULL
      【解决方案4】:

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

      作为一个假设示例,假设您有一个为用户创建报告的函数。输入数组包含要为其生成报告的用户的 ID(甚至对象)。当您需要处理所有用户而不是某些用户时,也可以使用相同的功能来处理报告。当您只想为特定用户处理时,您将放入数组中。但如果你想处理所有这些,那么参数是一个不同的 NULL 而不是“no users”是有意义的,这将是一个空数组。

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

      那么也许您在这个假设的系统中的其他地方可能有一个不同的按钮,“创建所有报告”,在这种情况下您不会投入任何东西,并且该函数将能够区分“用户数” = 0”和“未提供用户”,在这种情况下表示“所有用户”。

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

      【讨论】:

        【解决方案5】:

        也许你的 foo 函数必须在函数被一个空数组显式调用时做一些事情。我的意思是:

        如果

        foo(array());
        

        不做同样的事情

        foo();
        

        那么你必须使用$arg = NULL

        【讨论】:

          【解决方案6】:

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

          如果你使用$arg = array(),会有一个特定的指令来创建一个数组,即使是PHP,一个指令仍然会消耗CPU周期。如果你只是做 $arg = NULL,那么什么都不会做。

          【讨论】:

          • 节省的费用可能微乎其微。但是array $arg=NULL 确实允许参数为NULL,而array $arg=array() 则在参数为NULL 时触发错误。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-08
          • 1970-01-01
          • 2016-09-19
          • 1970-01-01
          • 2021-10-26
          • 2012-09-17
          • 2014-02-16
          相关资源
          最近更新 更多