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
相关产品推荐
相关产品推荐

