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
come gli operatori sono raggruppati. Per esempio "-" è associativo a sinistra, quindi
1 - 2 - 3
è raggruppato come (1 - 2) - 3
e valutato come -4
. D'altra parte "=" è
associativo a destra, quindi $a = $b = $c
è raggruppato come
$a = ($b = $c)
.
Operatori di uguale precedenza che non sono associativi non possono essere usati
vicini l'uno all'altro, per esempio 1 < 2 > 1
è
illegale in PHP. D'altra parte l'espressione 1 <= 1 == 1
è legale, perchè l'operatore ==
ha una minore
precedenza dell'operatore <=
.
L'associatività è significativa solo per gli operatori binari (e ternari).
Gli operatori unari sono prefisso o suffisso, quindi questa nozione non è applicabile.
Ad esempio !!$a
può essere raggruppato solo come !(!$a)
.
L'uso delle parentesi, anche quando non strettamente necessario, può spesso aumentare
la leggibilità del codice rendendo il raggruppamento esplicito piuttosto che fare affidamento
sulla precedenza e sull'associatività implicite degli operatori.
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 il raggruppamento.
Example #1 Associatività
<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
// l'associatività dell'operatore ternario differisce da quella di C/C++
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2 (prima di PHP 8.0.0)
$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
?>
La precedenza e l'associatività dell'operatore determinano solo come le espressioni
sono raggruppate, esse non specificano un ordine di valutazione. PHP non
specifica (nel caso generale) in quale ordine un'espressione è valutata
e un codice che presuppone uno specifico ordine di valutazione dovrebbe essere evitato,
perchè il comportamento può cambiare tra le versioni di PHP o in base al
codice circostante.
Example #2 Ordine di valutazione indefinito
<?php
$a = 1;
echo $a + $a++; // può stampare 2 o 3
$i = 1;
$array[$i] = $i++; // può impostare l'indice 1 o 2
?>
Example #3 +
, -
e .
hanno la stessa precedenza (prima di PHP 8.0.0)
<?php
$x = 4;
// questa linea potrebbe causare un risultato inaspettato:
echo "x minus one equals " . $x-1 . ", or so I hope\n";
// perché è valutata come questa linea (prima di PHP 8.0.0):
echo (("x minus one equals " . $x) - 1) . ", or so I hope\n";
// la precedenza desiderata può essere forzata usando le parentesi:
echo "x minus one equals " . ($x-1) . ", or so I hope\n";
?>
Il precedente esempio visualizzerà:
-1, or so I hope
-1, or so I hope
x minus one equals 3, or so I hope
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.