Comparing String to Integer gives strange results

后端 未结 5 1829
北恋
北恋 2020-11-22 16:41

I\'m really confused as to why this operation works. Can someone explain it?

$test1 = \"d85d1d81b25614a3504a3d5601a9cb2e\";
$test2 = \"3581169b064f71be1630b         


        
5条回答
  •  长发绾君心
    2020-11-22 17:05

    Type conversion using the == operator

    The == operator is a loosely-typed comparison. It will convert both to a common type and compare them. The way strings are converted to integers is explained here.

    Note that the page you linked to doesn't contradict this. Check the second table, where it says that comparing the integer 0 to a string "php" using == shall be true.

    What happens is that the string is converted to integer, and non-numeric strings (strings that do not contain or begin with a number) convert to 0.

    Numeric vs non-numeric strings

    A string that consists of a number, or begins with a number, is considered a numeric string. If the string has other characters after that number, these are ignored.

    If a string starts with a character that cannot be interpreted as part of a number, then it is a non-numeric string and will convert to 0. This doesn't mean that a numeric string has to start with a digit (0-9) - for example "-1" is a numeric string because the minus sign is part of a number in that case.

    So for example, your string "d85d1d81b25614a3504a3d5601a9cb2e" does not start with a number, so it would convert to 0. But your second string "3581169b064f71be1630b321d3ca318f" would be converted to integer 3581169. So that's why your second test does not work the same way.

    What you should do

    You probably want:

    if ($test1 === "0")
    

    Notice the use of triple equals instead of a double equals. This ensures that what you are comparing is a string that contains the digit zero only, and prevents any type conversion.

提交回复
热议问题