Underlying philosophy behind php type comparisons

So there's this page on the php site which shows the result of comparing different values:

http://php.net/manual/en/types.comparisons.php

This is a helpful reference, but I would rather not have to visit this page every time I want to make sure that I'm doing type comparison right. So my question is

Is there some kind of underlying philosophy/reasoning behind the logic of type comparisons on PHP?

For example, I can see that for loose comparisons:

  • 1, -1, "1" and "-1" can be treated as TRUE and 0 and "0" can be treated as FALSE;
  • Comparing the string value of a number against the number itself with yield TRUE;
  • but it becomes a bit hairy from then on trying to establish a pattern.


    For casting directly to a boolean this is how it works.

  • All string with a length > 0 are true
  • All non 0 numbers are true
  • All non-empty arrays are true
  • All objects are true
  • Then these rules for comparing variables of the same type:

  • Objects are equivalent if their properties are equal
  • Arrays are equivalent if their keys and elements are equal
  • Strings are equivalent if they would produce the same output
  • Numbers are equivalent if they are mathematically equivalent
  • Booleans are equivalent if they have the same value.
  • For variable of different types the type that is higher on the above list is cast to the one that is lower then the comparison is made.

    === and !== operators don't cast prior to comparing but you should note objects are only === if they are the same instance.

    The really odd one is arrays, they are === if they have the same keys and values defined in the same order.

    $a = array("a"=>1, "b"=>2);
    $b = array("b"=>2, "a"=>1);
    
    $a == $b; // true
    $a === $b; // false
    

    and empty() is equivalent to !(bool)$var

    EXCEPTIONS

  • Casting an array to a string will trigger a notice and unhelpfully cast as the text Array
  • Casting an object without a __toString method to a string will get you a fatal error.
  • Objects will not implicitly cast to an array, so any time you compare an object to an array it will yield a false ( UPDATE confirmed that this is true even if object implemtents the ArrayAccess interface)

  • For strict === comparision, the logic is easy: each value entity is equal only to itself, so TRUE === TRUE , "1" === "1" , but "1" !== 1 etc.

    When it comes to == comparision, unfortunately there is no rule of thumb nor a clear logic . This is probably because the various forms of the operator were implemented by different programmers, without a central design decision. The best I can do is providing you with this graph to print and stick over the monitor:

    PHP等式图

    The key of the grap is: A == B will be TRUE if and only if A and B are of two types directly connected by a line in the graph above. For instance, array() == NULL is TRUE because array() and NULL are directly connected, while array() == 0 is FALSE because there is no line connecting the two.

    Lines marked in red are the tricky (non obvious) equalities .

    I've omitted that each entity will be equal to itself (eg "1" == "1" etc.) but that should be easy to remember.

    As a final note, I'd like to explain why "php" == 0 is TRUE (non empty, non number string is equal to 0 ): because PHP casts "php" to number before comparision and, since it's not a number, it defaults to 0 and makes the test TRUE .

    Fun fact: there is no partition in this relation! If ever a transitive closure was allowed, you could easily say that True is False and False is True, destroying millennia of philosphy in four easy PHP statements :D


    If the value contains something then it can be said to be true . For example, 1 , 1.123 , array("value") , etc. are all treated as true .

    If the value can be said to be empty or void (ie lacking something) then it is seen as false . For example, 0 , 0.0 , array() , and so on.

    This way of thinking about variables is not special to PHP. Many other languages do it in the same or similar way. Eg Perl, C and Javascript, just to name a few.

    链接地址: http://www.djcxy.com/p/58514.html

    上一篇: 声明评估为真?

    下一篇: 背后的PHP类型比较背后的哲学