根据PHP documentation的返回类型声明(强调我的):
....在默认的弱模式下,如果返回的值不是那种类型,则它们将被强制转换为正确的类型。
这意味着方法returnInt()
class A {
public function returnInt(): int {
return "6a";
}
}
将返回int值6(应该如此)。
但是,从上面的函数返回null
会抛出一个TypeError,即使使用(int) null
可以很容易地将null强制转换为整数0
FATAL ERROR未捕获的TypeError:A :: returnInt()的返回值必须是integer类型,返回null
为什么这对null值不起作用?
PHP在尝试类型强制时使用了什么逻辑?
这是预期的并且是设计的。您可以在http://wiki.php.net/rfc/return_types找到此功能的原始RFC。
具体来说,有一节Disallowing NULL on Return Types
说:
这种情况在许多语言中都很常见,包括PHP。根据设计,此RFC不允许在这种情况下返回null,原因有两个:
- 这与当前参数类型行为一致。当参数声明了类型时,不允许值为null。
- 默认情况下允许null不符合类型声明的目的。类型声明使得更容易推断周围的代码。如果允许null,程序员总是要担心null的情况。
现在,我无法在这个rfc中看到任何关于类型转换的讨论,而官方文档则这样做,因此机会为空的转换并不是因为RFC明确表示它不起作用。就我个人而言,我认为留空是奇怪的。它也可能被认为与可空类型rfc相关联,这可能对确定null的工作方式产生了影响。
我不能说我个人同意它是如何成功的,但我不是核心开发人员:)。
当声明类型返回值时,rule没有返回null
,取代了关于coercing returned values到声明类型的规则。
最重要的是这个:
这与当前参数类型行为一致。当参数声明了类型时,不允许值为null
如果你的函数或方法需要一个不可为空的int作为参数,你不能传递一个空值并期望它被强制转换,但你可以传递一个字符串或一个布尔值。
EG
function foo (int $bar) {
echo "Received: ", $bar, "\n";
}
foo("1");
foo(false);
foo(null);
前两个将工作,but the last won't。
为了保持一致性,RFC选择与此异常对齐。
您的选择是显而易见的,要么返回一个可空的int:
function foo(): ?int {
return null;
}
或者,如果这不可取,只需在发回之前强制退回您的返回值:
function foo(): int {
return (int) null;
}