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: [EMAIL PROTECTED]
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