根据PHP documentation获得返回类型声明(重点是我的):
....在默认的弱模式下,如果返回的值还不是该类型,则将其强制转换为正确的类型。
这意味着方法returnInt()
class A {
public function returnInt(): int {
return "6a";
}
}
将返回int值6(应该如此)。
尽管使用null
可以很容易地将null强制为整数0,但是从上述函数返回(int) null
会引发TypeError。
致命错误未捕获的TypeError:A :: returnInt()的返回值必须为整数类型,返回null
这为什么不适用于空值?
PHP尝试强制转换时使用什么逻辑?
答案 0 :(得分:4)
这是预期的,是设计使然。您可以在http://wiki.php.net/rfc/return_types上找到此功能的原始RFC。
尤其是Disallowing NULL on Return Types
部分指出:
这种情况在包括PHP在内的许多语言中都很常见。通过设计,此RFC不允许在这种情况下返回null的原因有两个:
- 这与当前参数类型的行为保持一致。当参数具有声明的类型时,不允许为null。
- 默认情况下允许null违反类型声明的目的。使用类型声明可以更轻松地推断周围的代码。如果允许使用null,则程序员将始终不得不担心null的情况。
现在,我在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;
}