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