php - 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 在尝试类型强制时使用什么逻辑?
解决方案
声明类型化的返回值时不返回的规则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;
}
推荐阅读
- amazon-web-services - ECS 是否使用 Docker 层缓存来加速部署?
- azure - 连接字符串远程工作,但不能从 Azure
- regex - http > https 错误的最终 url(子域重定向)
- c# - 带有 IdentityServer4 的 ASP.NET Core - 多个租户 - 在运行时更改权限
- c# - 如何修复内存泄漏c#
- angular - 直到 promise 完成它的工作后代码才会执行
- javascript - Javascript:按下“后退”按钮时如何取消禁用按钮
- flutter - 初学者问题 dart/flutter:从列表中提取信息
- python - 无法加载 gridworld-v0 环境
- python - 如何过滤最佳相关并在一个查询中创建?