类型转换和与松散运算符"=="的比较

fro*_*ous 7 php comparison casting

我有一个令我困惑的问题.我之前注意到了这一点,但直到今天才注意到它.我试图编写自己的整数字符串检查.我知道的is_numeric(),但它是不够的,因为它计算float的数字不仅integersis_int()不上的串号工作.

我做了类似的事情


$var1 = 'string';
$var2 = '123'; 

var_dump( (int)$var1 == $var1);// boolean true 
var_dump((int)$var2 == $var2);// boolean true

 var_dump((int)$var1);//int 0
 var_dump($var1);//string 'string' (length=6)
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,第二个var转储输出为真,因为我期望与php的松散比较,字符串和整数版本相等.

然而,对于第一个,我不明白为什么会这样.我尝试过施法bool,它仍然给我相同的结果.

我已经尝试将cast var赋值给一个新的变量并比较两者,结果仍然相同

这是我做错了什么,还是一个php bug?

***注意我不是在这里比较类型.我实际上是想利用int 0不等于的事实string 'string'.

我用不同的方式编写了整数检查,所以我真的不需要替代方案.

***编辑我做了一些额外的检查,结果证明这0 == 'string'也是正确的.怎么可能?

***编辑2问题下面有多个正确答案.感谢所有回答的人.

zne*_*eak 7

这不是一个错误,它是一个功能.任何字符串都可以转换为整数,但如果字符串不以整数值开头,则转换将返回0.此外,在比较整数和字符串时,字符串将转换为整数,然后对两个整数进行检查.由于该规则,任何随机字符串都"等于"为零.(要绕过此行为,您应该使用strcmp,因为它通过转换传递给字符串的任何内容来执行显式字符串比较.)

为了确保我正在处理一个整数,我is_numeric先使用,然后将字符串转换为a int,并验证stringified int是否对应于输入值.

if (is_numeric($value) && strcmp((int)$value, $value) == 0)
{
    // $value is an integer value represented as a string
}
Run Code Online (Sandbox Code Playgroud)