PHP Australia Conference 2015

Precedenza degli operatori

La precedenza di un operatore specifica come esso tenga legate assieme "strettamente" due espressioni. Per esempio, nell'espressione 1 + 5 * 3, la risposta è 16 e non 18 perché l'operatore di moltiplicazione ("*") ha una precedenza più alta rispetto all'operatore di addizione ("+"). Le parentesi possono essere usate per forzare la precedenza, se necessario. Per esempio: (1 + 5) * 3 viene valutata 18.

Quando gli operatori hanno precedenza identica, la loro associatività decide se sono valutati partendo da destra o da sinistra - vedere gli esempi qui sotto.

La seguente tabella fornisce una lista della precedenza degli operatori con gli operatori a più alta precedenza elencati prima. Gli operatori presenti nella medesima linea hanno uguale precedenza, in questi casi la loro associativià decide l'ordine con cui sono valutati.

Precedenza degli operatori
Associatività Operatori Informazioni aggiuntive
non associativi clone new clone e new
sinistra [ array()
destra ++ -- ~ (int) (float) (string) (array) (object) (bool) @ types and increment/decrement
non associativi instanceof tipi
destra ! operatori logici
sinistra * / % operatori aritmetici
sinistra + - . operatori aritmetici e operatori su stringhe
sinistra << >> operatori sui bit
non associativi < <= > >= operatori di confronto
non associativi == != === !== <> operatori di confronto
sinistra & operatori sui bit e riferimenti
sinistra ^ operatori sui bit
sinistra | operatori sui bit
sinistra && operatori logici
sinistra || operatori logici
sinistra ? : Operatore ternario
sinistra = += -= *= /= .= %= &= |= ^= <<= >>= => operatori di assegnazione
sinistra and operatori logici
sinistra xor operatori logici
sinistra or operatori logici
sinistra , diversi usi

Per operatori con uguale precedenza, l'associazione a sinistra indica che l'espressione viene valutata da sinistra verso destra, e l'associazione destra indica il contrario.

Example #1 Associatività

<?php
$a 
5// (3 * 3) % 5 = 4
$a true true 2// (true ? 0 : true) ? 1 : 2 = 2

$a 1;
$b 2;
$a $b += 3// $a = ($b += 3) -> $a = 5, $b = 5

// mescolare  ++ e + produce un comportamento indefinito
$a 1;
echo ++
$a $a++; // può stampare 4 o 5
?>
Utilizzare le parentesi, anche quando non è strettamente necessarion, pùò spesso aumentare la leggibilità del codice.

Nota:

Sebbene = abbia una precedenza minore rispetto alla maggior parte degli altri operatori, PHP permette comunque espressioni simili alla seguente: if (!$a = foo()), in questo caso l'output di foo() viene inserito in $a.

add a note add a note

User Contributed Notes 4 notes

up
14
headden at karelia dot ru
5 years ago
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
up
9
Carsten Milkau
2 years ago
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.
up
5
Antistone
7 months ago
BEWARE:  Addition, subtraction, and string concatenation have equal precedence!
<?
$x
= 4;
echo
"x minus one equals " . $x-1 . ", or so I hope";
?>
will print "-1, or so I hope"

(Concatenate the first string literal and the value of $x, then implicitly convert that to a number (zero) so you can subtract 1 from it, then concatenate the final string literal.)
up
-1
leipie at gmail dot com
1 year ago
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!
To Top