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:
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.
Then these rules for comparing variables of the same type:
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
Array __toString method to a string will get you a fatal error. 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:

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类型比较背后的哲学
