Although example above already shows it, I'd like to explicitly state that ?: associativity DIFFERS from that of C++. I.e. convenient switch/case-like expressions of the form
$i==1 ? "one" :
$i==2 ? "two" :
$i==3 ? "three" :
"error";
will not work in PHP as expected
Operator-Rangfolge
Die Operator-Rangfolge legt fest, wie "eng" ein Operator zwei Ausdrücke miteinander verbindet. Zum Beispiel ist das Ergebnis des Ausdruckes 1 + 5 * 3 16 und nicht 18, da der Multiplikations-Operator ("*") in der Rangfolge höher steht als der Additions-Operator ("+"). Wenn nötig, können Sie Klammern setzen, um die Rangfolge der Operatoren zu beeinflussen. Zum Beispiel ergibt: (1 + 5) * 3 18. Ist die Rangfolge der Operatoren gleich, wird links nach rechts Assoziativität benutzt.
Die folgende Tabelle zeigt die Rangfolge der Operatoren, oben steht der Operator mit dem höchsten Rang.
| Assoziativität | Operator |
|---|---|
| keine Richtung | new |
| rechts | [ |
| rechts | ! ~ ++ -- (int) (float) (string) (array) (object) @ |
| links | * / % |
| links | + - . |
| links | << >> |
| keine Richtung | < <= > >= |
| keine Richtung | == != === !== |
| links | & |
| links | ^ |
| links | | |
| links | && |
| links | || |
| links | ? : |
| rechts | = += -= *= /= .= %= &= |= ^= <<= >>= |
| rechts | |
| links | and |
| links | xor |
| links | or |
| links | , |
Hinweis:
Obwohl ! einen höheren Rang gegenüber = hat, erlaubt es Ihnen PHP immer noch ähnliche Ausdrücke wie den folgenden zu schreiben: if (!$a =foo()).In diesem Ausdruck wird die Ausgabe von foo() der Variablen $a zugewiesen.
Beware the unusual order of bit-wise operators and comparison operators, this has often lead to bugs in my experience. For instance:
<?php if ( $flags & MASK == 1) do_something(); ?>
will not do what you might expect from other languages. Use
<?php if (($flags & MASK) == 1) do_something(); ?>
in PHP instead.
Going by the precedence,
$b=2;
if ($a=$b && $a >1)
{
echo "Passed";
}
else
{
echo "Failed";
}
will print "Failed".
The precedence of the arrow operator (->) on objects seems to the highest of all, even higher then clone.
But you can't wrap (clone $foo)->bar() like this!
