php - 为什么 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。
解决方案
“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 的技术背景部分找到。
推荐阅读
- sql - 如何从 BigQuery 查询结果创建所需的分区表字段?
- python - 在 Azure ml 中安装 python 包
- python - RuntimeError:在请求上下文 Flask 之外工作
- elasticsearch - 需要从 Elasticsearch 上的 AND、OR 过滤器升级为 ES7 的布尔查询
- amazon-web-services - AWS 许可证管理器:如何确定谁使用了权利?
- json - 如何使用 JSON 根据另一列的内容过滤共享点列表中的查找?
- wordpress - 在 Dokan 插件的供应商新订单电子邮件中隐藏自定义 Woocommerce 附加费
- sql - 将 STUFF + FOR XML 从 SQL 转换为 Snowflake
- python - 在python中使用pandas for fsspec时导入错误?
- ios - 为什么点击应用程序图标在carplay中打开时carplay和react native应用程序崩溃?