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
将不会是。但我明白你的意思。现在有道理了。我不知道它是这样工作的。谢谢!:)将其标记为正确答案,因为它显然是正确的。然后您必须对它们进行一些操作。将这样做;)是的。