RE: [PHP-DB] weird comparsion
| From: | Ford, Mike | Date: | Thu, 03 May 2007 12:42:31 +0000 |
| Subject: | RE: [PHP-DB] weird comparsion | ||
| Groups: | php.db | ||
| Request: | Send a blank email to php-db+get-43540@lists.php.net to get a copy of this message | ||
On 03 May 2007 12:30, OKi98 wrote:
> I know about identity operator (===) but with == operator 0 is false
> and "foo" is true
No, that's not correct.
, try this:
>
> $foo=0;
> $bar="bar";
> if ($foo) echo("$foo is true, ");
> else echo("$foo is false, ");
> if ($bar) echo("$bar is true, ");
> else echo("$bar is false, ");
> if ($foo==$bar) echo("$foo==$bar");
>
> returns "0 is false, bar is true, 0==$bar"
That's because you've got loads of implicit type conversions going on there, so
you're not comparing like with like.
For if ($foo) ... and if ($bar) ...:
within the context of the if(), both $foo and $bar are implicitly converted to Boolean:
- (bool)0 is FALSE
- (bool)"any non-empty() string" is TRUE
On the other hand, for if ($foo==$bar) ...:
in the context of the == comparison, $bar is converted to a number, and any string not beginning
with a numeric character converts to numeric zero -- so you get a comparison of zero with zero,
which is, of course, TRUE!
Or, in other words, (bool)$foo!==(bool)$bar, BUT (int)$foo===(int)$bar
It's exactly when you *don't* want this kind of automatic type-conversion shenanigans
going on that you should use the === operator to make your intent entirely clear -- otherwise you
have to be extremely aware of the context in which you are evaluating your variables in order to
avoid hidden surprises like this.
Cheers!
Mike
---------------------------------------------------------------------
Mike Ford, Electronic Information Services Adviser,
JG125, The Headingley Library,
James Graham Building, Leeds Metropolitan University,
Headingley Campus, LEEDS, LS6 3QS, United Kingdom
Email: m.ford@leedsmet.ac.uk
Tel: +44 113 812 4730 Fax: +44 113 812 3211
To view the terms under which this email is distributed, please go to http://disclaimer.leedsmet.ac.uk/email.htm