PHP 7如何为null返回类型强制工作?

问题描述 投票:3回答:2

根据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在尝试类型强制时使用了什么逻辑?

php null return-type coercion
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中看到任何关于类型转换的讨论,而官方文档则这样做,因此机会为空的转换并不是因为RFC明确表示它不起作用。就我个人而言,我认为留空是奇怪的。它也可能被认为与可空类型rfc相关联,这可能对确定null的工作方式产生了影响。

我不能说我个人同意它是如何成功的,但我不是核心开发人员:)。


2
投票

当声明类型返回值时,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;
}
© www.soinside.com 2019 - 2024. All rights reserved.