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,程序员就必须始终担心null的情况
  • 现在,我在这个rfc中看不到任何类型转换的讨论,而官方文档是这样做的,所以机会为空不是因为rfc明确表示它不起作用而转换的。就我个人而言,我认为将null作为单数保留是很奇怪的。它也可能被认为是与可空类型RFC相关联的,这可能对NULL如何确定工作产生了影响。 我不能说我个人同意它的工作原理,但我不是一个核心开发人员:)。

    在声明类型化返回值时,on not returning
    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";
        }
    }