fro*_*ous 7 php comparison casting
我有一个令我困惑的问题.我之前注意到了这一点,但直到今天才注意到它.我试图编写自己的整数字符串检查.我知道的is_numeric(),但它是不够的,因为它计算float的数字不仅integers与is_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问题下面有多个正确答案.感谢所有回答的人.
这不是一个错误,它是一个功能.任何字符串都可以转换为整数,但如果字符串不以整数值开头,则转换将返回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)
| 归档时间: |
|
| 查看次数: |
2033 次 |
| 最近记录: |