首页 > 解决方案 > 为什么 is_numeric() 在传递看似数字的字符串时返回 false?

问题描述

我试图理解 PHP 中的数字字符串。我有以下代码:

var_dump(5 * "10 abc");
var_dump(is_numeric("10 abc"));

这给了我输出:

int(50)
bool(false)

这让我感到困惑,因为字符串“10 abc”似乎在第一个表达式中被解释为数字字符串(因此 int(50) 输出并且没有关于使用非数字值的警告),但是当运行 is_numeric()函数它返回false,表明它实际上不是数字字符串。

我花了一些时间查看文档以了解这种行为,但找不到任何具体的答案,有人可以帮忙解释导致这种行为的原因吗?

我知道 PHP 8.0.0 对被认为是数字字符串的内容进行了一些更改,但这是我现在正在尝试理解的 PHP 7.1.33。

标签: phpstringnumericisnumeric

解决方案


“Saner numeric string” RFC 的 RFC 作者,在此处被 PHP 8.0 接受。

"10 abc"不是数字字符串,而是前导数字字符串,这意味着字符串的开头看起来像一个数字,但它不是一个数字,因为在字符串中的某个点存在乱码(这包括空格)。

因为is_numeric()根据 PHP 的定义检查一个值是否被视为数字(在 PHP 8.0 之前,这意味着前导空格后跟一个 + 或 - 号以及任何整数、普通十进制数或指数表示法的数字),它将返回false仅被视为前导数字的字符串。

但是,算术运算会尝试将其操作数转换为适当的数字类型(int 或 float),因此"10 abc"会被转换为, 10因为 PHP 会将前导数字字符串转换为其前导数值。

更多“有趣”的细节和边缘案例可以在PHP RFC 的技术背景部分找到。


推荐阅读