views:

160

answers:

4

I just reduced a crazy bug to what's in the title of this question. I'm sure there's a Perfectly Reasonable Explanation for why Php thinks that 0 == '%' (or any other special character, I think). I thought it would be good to get that explanation on StackOverflow!

A: 

since '%' isn't true, it ought to be false (0), so of course 0=='%'

;-) funny though

Peter Perháč
It does not convert string to bool, another operand is integer and not bool.
Goran Rakic
+5  A: 

It will do the same to any string, converting a non-number string to integer always gives 0.

Goran Rakic
+4  A: 

Using '===' (for exact, literal comparison -- the values must be the same type and also equal) instead of '==' solves this problem. With '==' it's trying to cast '%' to a number and 0 is the best it can do.

dreeves
If you use ===, take care that $x = '0'; var_dump($x === 0) gives false ($x is string, 0 is an integer) :)
Goran Rakic
+1  A: 

In the event that a strict comparison operator is not directly suitable, if you want both values to be compared as strings, you can use strcmp(). An example could be where both values are variables, and the types might be either string, or int. Instead of type casting to string and then using strict equality check, strcmp() can be less verbose.

php's type coercion is very convenient. But if you don't understand its many rules(some can bite), you should try to avoid using it. See http://www.php.net/manual/en/types.comparisons.php

chris