Php Intval的意外行为
这里,Php Intval的意外行为,php,Php,这里,$username是一个userinput,我试图检查该条目是用户名还是userid(所有整数) 我想使用intval函数来查看$username和intval($username)是否相同,这意味着输入是一个用户ID 我的输入是google。而intval('google')为0。为什么执行if语句的真实部分?有什么想法吗 我不使用==,因为用户输入将是一个字符串 if($username == intval($username)) { echo "userid";
$username
是一个userinput,我试图检查该条目是用户名还是userid(所有整数)
我想使用intval函数来查看$username
和intval($username)
是否相同,这意味着输入是一个用户ID
我的输入是google
。而intval('google')
为0。为什么执行if语句的真实部分?有什么想法吗
我不使用==
,因为用户输入将是一个字符串
if($username == intval($username))
{
echo "userid";
}
else
{
echo "username";
}
不确定发生意外行为的原因。发生这种情况是因为比较运算符的
转换
和类型杂耍
intval('anystring')
将是0
当比较字符串时,它也会转换为数值。因此,当转换字符串时,它也将是0
如果将数字与字符串进行比较,或者比较涉及数字字符串,则会将每个字符串转换为数字,并以数字形式执行比较。这些规则也适用于switch语句。当比较为===或!==时,不会发生类型转换因为这涉及到比较类型和值
所以在本例中,'google1'==intval('google')
将是0==0
,这是真的。对于此类比较,请始终使用相同(==)比较
这种情况的发生是因为类型杂耍。
从上的PHP手册:
各种类型的比较
操作数类型1 |操作数类型2 |结果
----------------------------------------------------------------------------------------------------------------
字符串,资源或数字|字符串,资源或数字|将字符串和资源转换为数字,常用数学
由于此处一个操作数是数字,一个是字符串,因此字符串将转换为数字,从而使您的检查等效于:
if(intval($username) == intval($username))
现在,如何解决这个问题:
is_int
将不起作用,因为它检查变量的类型,而is numeric
将起作用,但对于小数也将返回true,例如123.456
,这可能不是您想要的
我能想到的唯一真正的解决方案是将结果整数转换回字符串:
if($username === strval(intval($username)))
为什么不尝试is_numeric()?是的,我只会使用一个更好的函数,可能是is_numeric
,但我只是想知道为什么intval
和条件是否有这种意外行为。所以当字符串与整数进行比较时,字符串会转换为int,然后与整数进行比较?(这真的很奇怪?)是的。这就是为什么你应该使用===
。好吧,在我的情况下,我不能真正使用===
,因为$username
将始终是一个字符串,而intval
将不会是。但我明白你的意思。现在有道理了。我不知道它是这样工作的。谢谢!:)将其标记为正确答案,因为它显然是正确的。然后您必须对它们进行一些操作。将这样做;)是的。