PHP 8.0 改变了松散比较的工作方式

发布时间:2021-02-25 07:03

让我们有一个简单的 PHP 脚本

<?php
var_dump("php" == 0);

根据官方文档(https://www.php.net/manual/en/types.comparisons.php) ,这应该评估为 true

但是 对于 PHP <=7.4 可以,但对于 PHP 8.0

不行

在当前版本的 PHP 8 (8.0.0 - 8.0.2) 中,它评估为 false

Same script ran in different PHP docker images

此功能是否有任何未记录在案的更改或者这是一个错误?还是我遗漏了什么?

谢谢

回答1

当 PHP 8 发布时,他们还在网站上放了一个 release announcement。这是新的重大变化之一 saner string to number comparison 的一部分。

引用:

<块引用>

当与数字字符串比较时,PHP 8 使用数字比较。否则,它将数字转换为字符串并使用字符串比较。

回答2

此行为记录在 Backward incompatible changes 中。

<块引用>

字符串与数字的比较

现在数字和非数字字符串之间的非严格比较 通过将数字转换为字符串并比较字符串来工作。 数字和数字字符串之间的比较继续作为 前。值得注意的是,这意味着 0 == "not-a-number" 被认为是 现在是假的。

回答3

PHP 文档维护者在这里,PHP 8 确实改变了语义,这在迁移指南中有所显示。然而,文档的其他部分仍然滞后,因为我们没有人力/时间来编辑和记录与 PHP 8 相关的所有更改。

所以这不是错误,而是当前类型杂耍页面对于 PHP 8.0 已过时的事实。

可以通过对 GitHub 存储库的拉取请求为文档做出贡献。