Unexpected behaviour of Intval
在这里,$username是一个用户输入,我试图检查该条目是用户名还是用户标识(所有整数)
我想使用intval函数来查看和intval($username)是相同的,这意味着输入是用户ID。
我输入的输入是google。并且intval('google')为0。为什么执行if语句的真正部分?
我不使用===,因为用户输入将是一个字符串。
1 2 3 4 5 6 7 8
| if($username == intval($username))
{
echo"userid";
}
else
{
echo"username";
} |
不确定为什么会发生意外行为。
- 为什么不尝试使用is_numeric()?
- 是的,我将使用更好的功能,可能是is_numberic,但只是想知道为什么intval和if条件具有这种意外行为。
由于conversion
- 因此,当将字符串与整数进行比较时,该字符串将转换为int,然后与整数进行比较? (这真的很奇怪吗?)
- 是的。这就是为什么您应该使用===的原因。
- 好吧,就我而言,我不能真正使用===,因为$username始终是字符串,而intval不会。但我明白你的意思。现在有意义。 Didnt知道它是这样工作的。谢谢! :)将其标记为正确答案,因为显然是。
- 然后,您必须对他们做一些技巧。
- 会做到的;)是的。
- 使用您使用的函数(intval()),无论如何处理字符串都不会得到实际结果,即使它全是字母或数字或混合形式。因此,尝试使用不同的方法(例如is_numeric())来完成它。
这种情况是由于杂耍类型引起的。来自PHP比较运算符手册:
Comparison with Various Types
1 2 3
| Type of Operand 1 | Type of Operand 2 | Result
----------------------------------------------------------------------------------------------------------------
string, resource or number | string, resource or number | Translate strings and resources to numbers, usual math |
由于一个操作数是数字,而这里的一个是字符串,因此该字符串被转换为数字,从而有效地您的检查等同于:
现在,如何解决该问题:
is_int将不起作用,因为它会检查变量的类型,而is_numeric将进行排序工作,对于小数,例如123.456,它也将返回true,这可能不是您想要的。
我能想到的唯一真正的解决方案是将结果整数转换回字符串: