PHP字符串比较使用'=='

5

我用'=='对几个字符串进行了测试。我知道使用'=='比较字符串不是正确的方法,但有一个奇怪的行为我想要解决。

我正在遵循PHP文档中的页面Comparison Operators。这是我做的测试:

<?php
   var_dump( "100" == "1e2" ); // Outputs boolean true
   var_dump( (int) "100" ); // int 100
   var_dump( (int) "1e2" ); // int 1
?>

文档说明在比较字符串和数字时,PHP会将字符串转换为数字,但是当我将'100'和'1e2'转换为数字时,它们并不相等。比较应该输出布尔值false。
这种奇怪的行为是为什么呢?

顺便提一下,这就是为什么通常最好使用 === 而不是 ==,因为结果更可预测! - John Carter
“使用'=='比较字符串不是正确的方法”:那正确的方法是什么?使用三个等号(===)吗?这个问题在Stack Overflow上的规范问答是什么? - Peter Mortensen
2个回答

6

不是所有的数字都是整数。1e2 是一个浮点数(虽然可以表示为整数,但不能被直接转换为整数)。尝试将其转换为 float 而不是 int

<?php 
   var_dump( "100" == "1e2" ); // bool(true)
   var_dump( (float) "100" );  // float(100)
   var_dump( (float) "1e2" );  // float(100)
?> 

1
进一步解释一下,这里是文档中的说明。http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion "如果字符串不包含任何字符'.'、'e'或'E',并且数值适合整型类型限制(由PHP_INT_MAX定义),则该字符串将被视为整数。在所有其他情况下,它将被视为浮点数。" - Chris Gutierrez

1

类型转换不等于类型强制转换

来自类型转换页面

如果任一操作数为浮点数,则两个操作数都将作为浮点数进行评估,并且结果将是浮点数。否则,操作数将被解释为整数,并且结果也将是整数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接