【问题标题】:Type Hinting: Default Parameters类型提示:默认参数
【发布时间】:2012-01-21 07:40:26
【问题描述】:

PHP 5 Type Hinting

PHP 5 引入了类型提示。 函数现在能够将参数强制为对象(通过在函数中指定类的名称原型)或arrays自 PHP 5.1)。但是,如果将NULL 用作默认参数值,则允许将其作为任何后续调用的参数。

以上摘录如下:

如果 NULL 被用作默认参数值,它将被允许作为任何后续调用的参数。

以上意思是:

如果默认参数与类型提示一起使用,它只能有NULL作为默认值。

code1 中的代码错误,导致:

致命错误:带有类类型提示的参数的默认值只能是NULL

代码1:

 function setName ( string $name = "happ") {
  ...
  }

code2 中的代码是正确的:

代码2:

 function setName ( string $name = NULL) {
  ...
  }

为什么在 php 中分配这个约束?

【问题讨论】:

    标签: php type-hinting default-parameters


    【解决方案1】:

    你不能输入提示字符串,你只能输入提示对象和数组,所以这是不正确的:

    function setName ( string $name = "happ") {
    

    (这里没有出现编译时错误的原因是 PHP 将“字符串”解释为类名。)

    文档中的措辞意味着如果您这样做:

    function foo(Foo $arg) {
    

    那么传递给 foo() 的参数必须是对象 Foo 的一个实例。但如果你这样做:

    function foo(Foo $arg = null) {
    

    那么传递给 foo() 的参数可以是对象 Foo 的实例,也可以是 null。另请注意,如果您这样做:

    function foo(array $foo = array(1, 2, 3))
    

    那么你不能调用 foo(null)。如果你想要这个功能,你可以这样做:

    function foo(array $foo = null) {
        if ($foo === null) {
            $foo = array(1, 2, 3);
        }
    

    [Edit 1] 从 PHP 5.4 开始,您可以输入提示 callable:

    function foo(callable $callback) {
        call_user_func($callback);
    }
    

    [Edit 2] 从 PHP 7.0 开始,您可以键入提示 boolfloatintstring。这使得问题中的代码有效语法。从 PHP 7.1 开始,您可以输入提示 iterable

    【讨论】:

    • 我只想对未来的读者说,在不久的将来,php 很可能会支持某种形式的标量类型提示,所以这个答案会过时。
    • @rambocoder 我们仍在等待 PHP 5.6 的标量类型提示。
    • 现在在 PHP 7 中可以使用类型提示字符串和其他标量,但是当我输入提示 boolean $foo = true 时出现此错误,因为它必须是 bool $foo = true。 IE。当类型无效时会出现此错误。
    【解决方案2】:

    这是编译时间与运行时间值的问题。在编译时,只允许使用文字值(字符串、数字、布尔值和 NULL)。 PHP 处理器此时无法知道所有可能的类,因此您无法在函数参数中创建对象的实例。

    我对摘录的期望是,虽然通常将 NULL 传递给类型提示函数会引发异常/错误。如果您将默认值设置为 NULL,则在传递 NULL 时它不会抛出此异常。我没有测试它,只是我所期望的。

    【讨论】:

    • 感谢:This is a matter of compilation time versus run time values. At compilation only literal values (strings, numbers, booleans and NULL) are allowed.
      第二段参考上述答案。
    • 这是一个非常过时的答案。
    【解决方案3】:

    PHP 7 支持string 类型的Type declarations(在 PHP 5 中也称为类型提示)。

    valid types 是:

    • 类/接口名称 (>=PHP 5.0.0);
    • self (>=PHP 5.0.0);
    • array (>=PHP 5.1.0);
    • callable (>=PHP 5.4.0);
    • bool, float, int, string (>=PHP 7.0.0);
    • iterable - 数组或 Traversable 实例 (>=PHP 7.1.0)。

    【讨论】:

      猜你喜欢
      • 2018-12-05
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      相关资源
      最近更新 更多