PHP 7返回类型强制转换为null的工作方式是什么?

时间:2019-03-21 10:11:07

标签: php null return-type coercion

根据PHP documentation获得返回类型声明(重点是我的):

  

....在默认的弱模式下,如果返回的值还不是该类型,则将其强制转换为正确的类型

这意味着方法returnInt()

class A {
    public function returnInt(): int {
        return "6a";
    }
}

将返回int值6(应该如此)。

尽管使用null可以很容易地将null强制为整数0,但是从上述函数返回(int) null会引发TypeError。

  

致命错误未捕获的TypeError:A :: returnInt()的返回值必须为整数类型,返回null

这为什么不适用于空值?

PHP尝试强制转换时使用什么逻辑?

2 个答案:

答案 0 :(得分:4)

这是预期的,是设计使然。您可以在http://wiki.php.net/rfc/return_types上找到此功能的原始RFC。

尤其是Disallowing NULL on Return Types部分指出:

  

这种情况在包括PHP在内的许多语言中都很常见。通过设计,此RFC不允许在这种情况下返回null的原因有两个:

     
      
  1. 这与当前参数类型的行为保持一致。当参数具有声明的类型时,不允许为null。
  2.   
  3. 默认情况下允许null违反类型声明的目的。使用类型声明可以更轻松地推断周围的代码。如果允许使用null,则程序员将始终不得不担心null的情况。
  4.   

现在,我在RFC中看不到任何有关类型转换的说法,而官方文档却能看到,因此仅因为RFC明确表示不起作用而不能转换为null的机会。就我个人而言,我认为将null保留为奇数是奇怪的。可能还考虑到它与可为null的类型rfc链接,这可能对确定null的工作方式产生了影响。

我不能说我个人同意它的工作方式,但是我不是核心开发人员:)。

答案 1 :(得分:2)

在声明类型化的返回值时不返回null的{​​{3}}会将关于rule的规则替换为声明的类型。

最重要的是:

  

这与当前参数类型的行为保持一致。参数声明为类型时,不允许将其设置为空

如果您的函数或方法期望将不可为null的int作为参数,则不能传递null值并期望将其强制,但是例如,可以传递字符串或布尔值。

例如

function foo (int $bar) {
    echo "Received: ", $bar, "\n";
}

foo("1");
foo(false);
foo(null);

前两个将起作用,coercing returned values

出于一致性考虑,RFC选择符合此期望。

您的选择显而易见,要么返回可为null的int:

function foo(): ?int {
   return null;
}

或者,如果不希望这样,只需在返回之前强制您的返回值:

function foo(): int {
   return (int) null;
}