PHP7返回类型强制如何处理null?
根据返回类型声明(重点): 。。。。在默认的弱模式下,返回的值将被强制为正确的类型,如果它们不是该类型的值 这意味着方法PHP7返回类型强制如何处理null?,php,null,return-type,coercion,Php,Null,Return Type,Coercion,根据返回类型声明(重点): 。。。。在默认的弱模式下,返回的值将被强制为正确的类型,如果它们不是该类型的值 这意味着方法returnInt() 将返回int值6(它应该返回) 但是,从上面的函数返回null会抛出一个类型错误,即使null可以很容易地强制为带有(int)null的整数0 致命错误Uncaught TypeError:A::returnInt()的返回值必须是integer类型,返回null 为什么这对空值不起作用 PHP在尝试类型强制时使用的是什么逻辑?这是预期的,也是设计的结果
returnInt()
将返回int值6(它应该返回)
但是,从上面的函数返回null
会抛出一个类型错误,即使null可以很容易地强制为带有(int)null的整数0
致命错误Uncaught TypeError:A::returnInt()的返回值必须是integer类型,返回null
为什么这对空值不起作用
PHP在尝试类型强制时使用的是什么逻辑?这是预期的,也是设计的结果。您可以在找到此功能的原始RFC 具体而言,有一节
禁止返回类型为空
,其中规定:
这种情况在包括PHP在内的许多语言中都很常见。根据设计,此RFC不允许在这种情况下返回null,原因有两个:
null
取代了关于声明类型的规则
最重要的一点是:
这与当前参数类型行为一致。当参数声明了类型时,不允许null值
如果您的函数或方法需要一个不可为null的int作为参数,那么您不能传递null值并期望它被强制,但您可以传递字符串或布尔值,例如
例如
函数foo(int$bar){
回音“已接收:”,$bar,“\n”;
}
富(“1”);
傅(假),;
foo(空);
前两个将起作用
为了保持一致性,RFC选择与这一期望保持一致
您的选择是显而易见的,返回一个可为null的int:
函数foo():?int{
返回null;
}
或者,如果这不可取,只需在返回之前强制返回值:
函数foo():int{
返回(int)null;
}
正如php文档所说,从7.1开始,公共函数returnInt():?int是的,null不能在intGood中强制转换,但一般来说,您应该遵循最佳实践,使用实际类型,而不是依赖php进行正确的转换。@Frankich“null不能在int中强制转换”从何时开始@丹尼尔,那就这么做吧。不返回null,不返回非int值。问题避免耸肩,因为在PHP中<代码> null <代码>不是一个真正的类型,它是一个值,但更像是C++ >代码> Value<代码>。
class A {
public function returnInt(): int {
return "6a";
}
}