11. Operatori

Gli operatori sono usati principalmente per costruire espressioni.
Solitamente, essi vengono posizionati fra due valori per produrne un terzo, creando così un'espressione.

PHP ci mette a disposizione tre tipi di operatori :

  • Unari - Richiedono un solo valore (es. $i++)
  • Binari - Richiedono due valori (es. $x $y)
  • Terzari - Esiste un solo operatore ternario e richiede tre valori (es. $x = ($y == 0) ? 5 : 10)

Vediamo ora la tabella degli operatori ordinati per precedenza in ordine decrescente :

Posizione Operatore Ambito Descrizione
  new new Istanzia un nuovo oggetto
Destra [ ] Array Array subscript
Destra ! Operatore Logico NOT Logico
Destra ~ Operatore sui bit NOT sui bit
Destra ++ Incremento \ decremento Operatore di incremento
Destra -- Incremento \ decremento Operatore di decremento
Destra (int), (double), (string), (array), (object) Tipi Operatori di Casting
Destra @ Errori Inibisce gli errori
Sinistra * Operatore aritmetico Moltiplicazione
Sinistra / Operatore aritmetico Divisione
Sinistra % Operatore aritmetico Modulo (resto divisione ecc...)
Sinistra + Operatore aritmetico Addizione
Sinistra - Operatore aritmetico Sottrazione
Sinistra . Operatore su stringa Concatenazione stringhe
Sinistra << ; >> Operatori sui bit Scorrimento bit a sinistra e destra
< ; <= Operatori di confronto Minore ; Minore uguale
> ; >= Operatori di confronto Maggiore ; Maggiore uguale
== ; === Operatori di confronto Uguaglianza nel valore ;
Uguaglianza nel tipo e nel valore
!= ; <> ; !== Operatori di confronto Disuguaglianza ; Disuguaglianza ;
Disuguaglianza nel tipo e nel valore
Sinistra & Operatore sui bit AND sui bit o passaggio parametri/variabili
per riferimento (es. $x = &$y)
Sinistra ^ Operatori sui bit XOR sui bit
Sinistra | Operatore sui bit OR sui bit
Sinistra && ; || Operatori Logici AND Logico ; OR Logico
Sinistra ?: Operatore Ternario Operatore condizionale
Sinistra = Operatore d'assegnazione Operatore d'assegnazione
Sinistra += ; -= ; *= ; /= ; %= ; &= ; |= ; ^= ; ~= ; <<= ; >>= Operatori d'assegnazione Operatori d'assegnazione con operazione
Sinistra .= Operatore su stringa Assegnazione con concatenazione stringa
Sinistra and ; xor ; or Operatori Logici AND Logico ; XOR Logico ; OR Logico
Sinistra , Diversi usi Separatore liste

Vediamo ora un esempio sulla precedenza degli operatori, per capire anche come sfruttare al meglio questa tabella.
L'esempio consiste in una semplice espressione, con una addizione e una moltiplicazione. L'operatore *, come potete vedere nella tabella, precede l'operatore +, di conseguenza ha la precedenza nella seguente espressione :

echo 1 + 5 * 2; // stampa : 11 e non 12
echo (1 + 5) * 2; // stampa : 12

Di seguito altri esempi commentati sulla precedenza degli operatori :

$x = 5;
$y = 10;

echo $x > $y ? 2 * 4 : 10 / 2; // stampa : 5
echo $x < $y ? 2 * 4 : 10 / 2; // stampa : 8

Riporto altri esempi sull'utilizzo di vari operatori :

$x = $a + $b; // somma $a e $b e memorizza il valore in $x

$x = 5;
echo $x *= 14 % 6; // stampa : 10 (14 diviso 6 da 2 di resto, moltiplica 2 ad $x e lo memorizza in quest'ultima

echo $x++; // stampa : 10 (stampa la $x e poi la incrementa)
echo $x; // stampa : 11
echo ++$x; // stampa : 12 (prima incrementa $x e poi la stampa)
echo $x; // stampa : 12

$stringa = "Roma";
$stringa .= " Caput Mundi"; // $stringa diventa : "Roma Caput Mundi"

Vediamo ora a cosa serve l'operatore Ternario ?: e come si usa.
Questo operatore ci consente di valutare una espressione (condizione), e in caso venga soddisfatta viene eseguita una determinata operazione, altrimenti viene eseguita l'operazione alternativa.

Bisogna specificare prima la condizione seguita dal punto interrogativo ?, poi la prima operazione che sarà eseguita nel caso in cui la condizione viene soddisfatta, a seguire i due punti :, e infine la seconda operazione che verrà eseguita se la condizione NON viene soddisfatta.

$stringa = "At vero eos et accusam et justo duo dolores et ea rebum.";

$messaggio = strlen($stringa) >= 100 ? "Stringa di 100 caratteri o più!" : "Stringa con meno di 100 caratteri!";

echo $messaggio; // stampa : "Stringa con meno di 100 caratteri!"

Parliamo ora del Casting.
Il casting è un operazione il cui scopo è quello di convertire il tipo di un dato in un altro tipo.

E' possibile effettuare due tipi di casting : uno implicito impostato automaticamente da PHP, ed uno esplicito impostato da noi tramite gli operatori di casting. Vediamone due esempi.

echo "44 gatti " + 1; // stampa : 45 - Casting implicito
echo "44 gatti " . 1; // stampa : "44 gatti 1" - Casting implicito
echo 1.28 + 2; // stampa : 3.28 - Nessun casting
echo (int) 1.28 + 2; // stampa : 3 - Casting esplicito

Nella prima echo possiamo osservare un casting di tipo implicito, infatti PHP esegue un casting (int) sulla stringa "44 gatti" perchè viene seguita dall'operatore aritmetico +.

Nella seconda echo abbiamo ancora un casting di tipo implicito, ma stavolta del tipo (string) sul valore 1, perchè viene usato l'operatore di concatenazione stringhe.

Nella terza echo non viene effettuato nessun casting, ma serve a rendere più chiaro il casting esplicito della quarta echo, dove tramite l'operatore di casting (int), viene detto a PHP di considerare il numero come intero, e non come numero a virgola mobile.

Prima di chiudere il capitolo, rivediamo gli Operatori sui bit.

Questi operatori sono particolari perchè convertono prima gli operandi dell'espressione nella loro rappresentazione binaria.
Ecco un esempio di come lavora l'operatore logico sui bit & :

// Operatore sui bit &

111101101 &
110111001
-------------
110101001

In questo caso quindi, per ogni binario viene effettuata la AND che fallisce quando i bit non sono entrambi 1.

Per capire meglio l'aritmetica binaria, potete usare le funzioni bindec() e decbin(), per riconvertire i numeri da binario a decimale e viceversa, e vi consiglio anche di dare un'occhiata al capitolo "Operatori bitwise" della Documentazione Ufficiale di PHP.net costantemente aggiornata.