You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中空字符串隐式转换后为何'' < 0为true?兼谈PHP8差异

空字符串与数字比较的行为解析

版本差异导致的反常结果

PHP 7及更早版本

在PHP7及以前,字符串和数字用</>/<=/>=做大小比较时,逻辑分两种情况:

  • 若字符串是有效数字格式(如'123'、'4.5'),则转成数字按数值比较;
  • 若字符串不是有效数字格式(包括空字符串''、'abc'这类),则把数字转成字符串,按字典序比较。

对应你的例子:

  • '' < 0:数字0被转为字符串'0',空字符串在字典序里小于任何非空字符串,所以结果是bool(true);
  • (int)'' < 0:空字符串显式转成整数0,0 < 0自然是bool(false)。

'' < 0.0的逻辑同理:0.0转成字符串后和空字符串比字典序,结果为true;而显式转float后是0.0 < 0.0,结果为false。

PHP 8及之后版本

PHP8彻底统一了比较逻辑:所有字符串和数字的大小比较,都会先把字符串转成数字,再按数值比较,不再区分是否为有效数字字符串。

所以在PHP8里,'' < 0会把空字符串转成整数0,0 < 0结果为bool(false),和显式转换后的比较结果一致。

与文档描述的偏差原因

你看到的“字符串隐式转数字”的文档描述,在PHP8中是准确的,但PHP7及以前,这个规则只适用于==/!=这类相等性比较,不适用于</>的大小比较——后者在非有效数字字符串场景下会触发字典序比较,这是历史遗留的特殊行为,文档可能没明确区分两种比较的差异。

验证代码

// PHP7输出bool(true),PHP8输出bool(false)
var_dump('' < 0);
// 所有版本均输出bool(false)
var_dump((int)'' < 0);
// PHP7输出bool(true),PHP8输出bool(false)
var_dump('' < 0.0);
// 所有版本均输出bool(false)
var_dump((float)'' < 0.0);

内容的提问来源于stack exchange,提问作者volkerschulz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:35:32