Well per this PHP page: http://us2.php.net/manual/en/language.operators.comparison.php, "If you compare an integer with a string, the string is converted to a number. " So to follow this regarding your example: $x = 0; // Numeric zero $y = 'Some kind of string'; if (is_null($x)) echo "x is NULL<br>"; if (is_null($y)) echo "y is NULL<br>"; echo "x is [" . gettype($x) . "]<br>"; echo "y is [" . gettype($y) . "]<br>"; echo "y as integer=[" . (int)($y) . "]<br>"; if ($x == $y) echo 'they equal using =='; if ($x === $y) echo 'they equal using ==='; As you might see from the line 'echo "y as integer...' if you cast the string, $y, as an integer per the PHP page referenced above the value reported is integer zero. So this is how if can equal $x which is already an integer and value zero itself. No for some of you assumptions philosophies etc. Many think PHP is a typeless language. This is not accurate. PHP is actually a loosley-typed language. This is evident from the ability to assign type to variables. Also in the fact that you are allowed to compared variables to each other (at you own risk) even if the types do not match. This is very unlike other strong-typed languages like C and C++. The designers of the PHP language semantics had to make a choice in how a compare of mixed-typed variables would be handled. In my opinion, being a C++ developer in a former life, it is easier to convert the string to numeric than the numeric to string for the 'on-the-fly' compare. I hope this helps your understanding. My suggestion is if you are still of the mind this is a bug report it to PHP. P- --- Ross Honniball <ross@xxxxxxxxxxxxxxxxxxx> wrote: > I'm yet to be convinced it isn't a bug. I suspect it is a bug that has been around so long that > they can't afford to fix it or it may break many applications that for various peculiar reasons > rely on it to behave as it does for their code to work. > > For those who have tried to defend its behaviour, this is my logic. > > 1. The == operator means, by definition, "don't worry about variable 'type', just compare the > values" > (This is probably the single thing I love about PHP more than anything else) > > 2. If the numeric variable $x is given ANY other numeric value other than zero, > the logic behaves correctly as you read it > > So it is irrational for program logic to vary between a zero value and, for aguments sake, a > numeric value of 42. > > Regarding specifically TG's explanation below, I believe he is wrong. If you compare a numeric > type and a string type using ==, PHP should convert the number to a string and compare the two > from there. > > Anyway, not expecting any answers to this, just a point of note and a strange quirk to keep at > the back of your head when consciously comparing numeric / string variables. > > Ross > > tg-php@xxxxxxxxxxxxxxxxxxxxxx wrote: > > It's because PHP is trying to convert different var types into a common var type and then > compare them when you use ==. === means compare value AND type so that's why it fails. > > > > Your string, 'Some kind of string' is getting converted down to the lowest common denominator, > an int. Since there are no numbers in the string to grab onto, it gets converted to nothing, an > int value of zero. > > > > If you had $x = "0" or if $y had contained numbers at all, it wouldn't have passed. > > > > But this is why when you use $x.'' it works properly because now you have "0<empty string>", > it's been converted to a string value "0". Good catch on that though, shows good methodical > debugging :) > > > > So in the future, either use === or be extra aware of your variable types and make sure you're > comparing properly. > > > > Good luck! > > > > -TG > > > > = = = Original message = = = > > > > $x = 0; // Numeric zero > > $y = 'Some kind of string'; > > > > if ($x == $y) echo 'they equal using =='; > > if ($x === $y) echo 'they equal using ==='; > > > > The above will echo 'they equal using =='. > > > > The values don't look very equal to me. > > > > Can anyone explain the logic behind this? > > > > I'm heading home now but look forward to your explanations tomorrow. > > > > PS > > > > Incidently, to 'fix' it so it behaves as it should, you can code: > > > > if ($x.'' == $y.'') echo 'this will not print and all is good.'; > > > > Regards .. Ross > > > > > > ___________________________________________________________ > > Sent by ePrompter, the premier email notification software. > > Free download at http://www.ePrompter.com. > > > > > > -- > PHP Windows Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > > -- PHP Windows Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php