Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Wow, a downvote within 30 seconds of posting?

"php" == 0 returns true, and this makes sense how?



It doesn't make sense unless you understand how PHP works - at which point you'd use ===.


> It doesn't make sense unless you understand how PHP works ...

In other words: equality is not intuitive. Awesome!

---

Let's take a look at "how PHP works":

  0 == 08 // true!
WTF, really? Well, let's just use the magical 'I-mean-actual-equality-not-some-other-kind-of-equality' operator:

  0 === 08 // also true!

  (Sonofabitch/Facepalm) * Infinity
Of all the areas of a language in which one could gain expertise in, I think testing equality should not be one of the more difficult to master.

This is just stupid behavior. 08 is an invalid octal sequence, but no error is raised. You can't detect this condition unless you do your own pre-parsing before allowing PHP to try to parse it!


That's the grammar for PHP integer literals[1]:

    decimal     : [1-9][0-9]*
                | 0
    
    hexadecimal : 0[xX][0-9a-fA-F]+
    
    octal       : 0[0-7]+
    
    integer     : [+-]?decimal
                | [+-]?hexadecimal
                | [+-]?octal
"08" and "09" do not match any of these.

    php -r "var_dump(08);"
Yields "int(0)", while the case should rather be treated as a syntax error, if you ask me.

The bottom line probably is that your literals just shouldn't have leading zeroes…

[1] http://www.php.net/manual/en/language.types.integer.php


I've been programming in PHP for a long time and I've never ever accidentally used an octal anywhere. Does such a non-problem really need this much attention?


Perhaps you ask a user to enter the month of their CC expiration date, which is shown as 08/14 on their card.

  $v = validated_integer($user_input); // the user input 08
  if($v == 0 || $v === 0) { // let's just be safe
    
    // the Wrong Thing happens
    
  }
This is a contrived example, sure. But you've never checked to see if a user input the number 0? Or a non-zero, positive integer?


I'm not sure what you expect to happen there but the following code always produces "Correct!":

    $user_input = '08';
    $user_input = (integer)$user_input;
    if ($user_input == 8) echo 'Correct!';
    if ($user_input == 0) echo 'Incorrect!';
If you take out the cast, the result is the same. If you change the numbers to '010' and 10 respectively, the result is also "Correct!". There is no weirdness.


It makes sense for the same reason it makes sense in Perl: use a string as a number and you get the number that is at the start of the string. E.g., "12" == 12, and "12php" == 12.


But Perl has both "eq" and "==". PHP doesn't.


Perl recognises that it is a bad practice.

  perl -we ' print "true\n" if "12" == "12php"'
  Argument "12php" isn't numeric in numeric eq (==) at -e line 1.
  true

  perl -w -e 'my $foo = "12php"; $foo = $foo + 1; print $foo, "\n";'
  Argument "12php" isn't numeric in addition (+) at -e line 1.
  13
  
(an exception seems to be made for $foo++ though... that's Perl for you).


$foo++ isn't an exception. It has documented behavior on strings. That is sometimes very useful.


I meant it's an exception because it does not throw a warning, even though you are treating a string as a number. (This is contrary to $foo = $foo + 1). The DWIM string auto-increment doesn't even kick in unless the variable matches /^[a-z]/i.


That does not make sence that just meens both languages suck.


Because the string is first converted to an integer.

"==" makes the comparison after converting types (see: Type Juggling in the docs) where "===" requires that the types be the same in order to be equal.

Kind of weird the first time you see it, but it's a language design choice and does make sense once you understand it.


I think the reason people object to this behavior, even when they do understand it is that it makes the obvious default (==) dangerous. It's especially dangerous in the hands of the sort of non-experts for whom it's intended to make life easier.


== really isn't that dangerous unless you use it dangerously. Comparing non-numeric strings to numbers is already odd.


But then it means that "==" is no longer transitive, which I see as very unnatural and confusing (even if the underlying reasoning sort-of makes sense).


What doesn't make sense is the rationale for designing it this way.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: