PHP 7中的返回类型强制转换对null的处理方式是什么?

4
根据PHP文档中与返回类型声明相关的说明(我加粗部分):

...在默认的弱模式下,如果返回的值不是正确的类型,那么它们将被强制转换为正确的类型

这意味着方法returnInt()返回的值将被自动转换为正确的类型。
class A {
    public function returnInt(): int {
        return "6a";
    }
}

将返回int值6(正常情况下应该如此)。

然而,从上面的函数中返回null会抛出TypeError异常,尽管null可以通过(int)null轻松强制转换为整数0。

致命错误 未捕获的TypeError:A :: returnInt()的返回值必须是integer类型,但返回了null

为什么这在null值中不起作用?

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


1
正如 PHP 文档中关于返回值的函数所述,自 7.1 版本起,可以使用 public function returnInt(): ?int 来声明返回整数类型,但是无法将 null 强制转换为 int。 - Frankich
1
好问题,但通常情况下,您应该遵循最佳实践并使用实际类型而不是依赖于PHP进行正确转换。 - Daniel W.
1
@Frankich "null无法转换为int" 从什么时候开始的?https://3v4l.org/V2f6D - u_mulder
1
@Daniel 那就这么做吧。不要返回 null,也不要返回非整数值。问题解决了 耸肩 - Jonnix
1
可能是因为在PHP中,null不是一个真正的类型,它只是一个值,更像C++中的void - Daniel W.
显示剩余2条评论
2个回答

4
这是预期的设计。您可以在http://wiki.php.net/rfc/return_types找到此功能的原始RFC。

具体而言,有一个名为Disallowing NULL on Return Types的部分,其中指出:

这种类型的情况在许多语言中都很常见,包括PHP。按设计,此RFC不允许在这种情况下返回null,原因如下:

  1. 这与当前参数类型行为相一致。当参数声明了类型时,不允许使用null值。
  2. 默认情况下允许null会违反类型声明的目的。类型声明使周围的代码更容易推理。如果允许null,程序员将总是担心null情况。

现在,在这个rfc中我看不到任何关于类型转换的讨论,而官方文档则有,所以很可能null没有被转换,只是因为RFC明确表示它不能工作。个人认为,将null留作例外很奇怪。它也可能被考虑与可空类型RFC相关联,这可能会影响如何确定null的工作方式。

我个人并不认同它的工作方式,但我不是核心开发者:)。


4

不返回null的规则在声明类型返回值时具有优先级,超过了强制转换返回值到声明的类型的规则。

最重要的部分是:

这与当前参数类型行为相一致。当参数有声明类型时,不允许使用null值

如果你的函数或方法期望一个非空的int类型参数,你不能传递一个null值并期望它被强制转换,但你可以传递一个字符串或布尔值,例如。

例如:

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

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

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

为了保持一致性,RFC选择与此期望对齐。

你的选择很明显,要么返回可空的整数:

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

或者,如果不想这样做,只需在发送返回值之前强制转换它:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接