关于php:Intval的异常行为


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";
    }

不确定为什么会发生意外行为。


由于conversion


这种情况是由于杂耍类型引起的。来自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

由于一个操作数是数字,而这里的一个是字符串,因此该字符串被转换为数字,从而有效地您的检查等同于:

1
if(intval($username) == intval($username))

现在,如何解决该问题:

is_int将不起作用,因为它会检查变量的类型,而is_numeric将进行排序工作,对于小数,例如123.456,它也将返回true,这可能不是您想要的。

我能想到的唯一真正的解决方案是将结果整数转换回字符串:

1
if($username === strval(intval($username)))