首页 > 解决方案 > PHP 7 返回类型强制如何为 null 工作?

问题描述

根据返回类型声明的PHP 文档(强调我的):

.... 在默认的弱模式下,如果返回的值尚未属于该类型,则它们将被强制转换为正确的类型

这意味着该方法returnInt()

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

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

然而,null从上面的函数返回会抛出一个 TypeError,即使 null 可以很容易地强制转换为整数 0(int) null

FATAL ERROR Uncaught TypeError: A::returnInt() 的返回值必须是整数类型,返回 null

为什么这不适用于空值?

PHP 在尝试类型强制时使用什么逻辑?

标签: phpnullphp-7return-typecoercion

解决方案


声明类型化的返回值时不返回的规则null取代了将返回值强制转换为声明的类型的规则。

最重要的一点是:

这与当前的参数类型行为一致。当参数声明了类型时,不允许值为 null

如果你的函数或方法需要一个不可为空的 int 作为参数,你不能传递一个空值并期望它被强制,但你可以传递一个字符串或一个布尔值,例如。

例如

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

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

前两个会起作用,但最后一个不会

为了一致性起见,RFC 选择与这一预期保持一致。

您的选择是显而易见的,要么返回一个可为空的 int:

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

或者,如果这不是可取的,只需在发回之前强制您的返回值:

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

推荐阅读