Un operatore prende uno o più valori e ne produce uno nuovo: $a + $b somma, $a . $b unisce stringhe, $a && $b è un AND logico, $a === $b confronta, $i++ incrementa.
/ restituisce un float a meno che due interi non si dividano esattamente: 17 / 5 vale 3.4, 10 / 5 è l'intero 2. Quando vuoi solo la parte intera, usa intdiv(). L'arrotondamento è trattato nella pagina sulla matematica.
Operatori aritmetici
| Operatore | Nome | Esempio | Risultato |
|---|---|---|---|
+ | Addizione | 7 + 2 | 9 |
- | Sottrazione | 7 - 2 | 5 |
* | Moltiplicazione | 7 * 2 | 14 |
/ | Divisione | 7 / 2 | 3.5 |
% | Modulo (resto) | 7 % 2 | 1 |
** | Potenza | 7 ** 2 | 49 |
-$a | Negazione | -7 | -7 |
Il modulo è utile per "un elemento ogni N" e per i controlli pari/dispari. Il suo risultato prende il segno del lato sinistro, e la divisione per zero lancia un errore che puoi catturare:
Operatori di assegnazione
= memorizza un valore. Ogni operatore aritmetico e di stringa ha una forma combinata che aggiorna una variabile sul posto.
??= appartiene alla famiglia dell'operatore di null coalescing. Assegna solo quando la variabile non è impostata o è null.
Incremento e decremento: ++ e --
$i++ restituisce il valore attuale, poi aggiunge 1. ++$i aggiunge 1, poi restituisce il nuovo valore. La differenza si vede solo quando usi il risultato nella stessa espressione.
Il trucco con le lettere è il modo in cui spesso si generano i nomi delle colonne dei fogli di calcolo (A, B, ... Z, AA).
Operatori logici: &&, ||, ! e xor
| Operatore | Vero quando |
|---|---|
$a && $b | entrambi sono veri |
$a || $b | almeno uno è vero |
!$a | $a è falso |
$a xor $b | esattamente uno è vero |
$a and $b, $a or $b | come && e ||, con precedenza più bassa |
&& e || sono a corto circuito: il lato destro non viene valutato quando il lato sinistro decide già il risultato. È questo che rende sicuro isset($user) && $user->isAdmin().
and vs &&: la trappola della precedenza
and e or legano meno di =, quindi in un'assegnazione si applicano dopo che il valore è stato salvato. È un bug classico:
La precedenza bassa è utile in un idioma, $file = fopen($path, 'r') or die('Cannot open');, dove vuoi che l'assegnazione avvenga per prima. In tutti gli altri casi, usa && e ||.
Operatori di stringa: . e .=
PHP ha due operatori di stringa: . unisce due stringhe ("Grace" . " " . "Hopper") e .= aggiunge in fondo a una variabile ($html .= "<li>"). + non unisce mai le stringhe: "3" + "4" è il numero 7, mentre "3" . "4" è la stringa "34". La pagina sulle stringhe tratta interpolazione e virgolette.
Confronto e l'operatore spaceship <=>
== confronta dopo aver convertito i tipi, === controlla anche il tipo, e <=> restituisce -1, 0 o 1, che è esattamente ciò che serve alle callback di ordinamento. I dettagli e la tabella completa del confronto non stretto sono nella pagina sugli operatori di confronto.
Operatori sugli array
+ sugli array è un'unione: vincono le chiavi dell'array di sinistra e da quello di destra si aggiungono solo le chiavi mancanti. Sorprende chi si aspetta che accodi. == controlla che le coppie chiave/valore siano le stesse, === richiede anche lo stesso ordine e gli stessi tipi.
Per accodare una lista a un'altra, usa array_merge() o la sintassi spread [...$a, ...$b].
Precedenza degli operatori
Quando un'espressione mescola operatori, PHP li applica in un ordine fisso. Quelli che traggono più spesso in inganno, con ciò che stampa PHP 8.3:
echo 2 + 3 * 4; // 14: * before +
echo (2 + 3) * 4; // 20
echo 2 ** 3 ** 2; // 512: right to left, 2 ** 9
echo -2 ** 2; // -4: ** before unary minus
echo "Sum: " . 2 + 3; // Sum: 5, since PHP 8 + runs before .
Nel dubbio, aggiungi le parentesi. Non costano nulla e chi leggerà la riga dopo di te non dovrà ricordarsi la tabella.
Domande frequenti
Qual è la differenza tra and e && in PHP?
Sono entrambi un AND logico, ma and ha precedenza più bassa di =. Quindi $x = true and false; salva true in $x (l'assegnazione avviene prima), mentre $x = true && false; salva false. Usa && e || nelle espressioni e tieni and/or fuori dalle assegnazioni.
Cosa fa % in PHP?
% è l'operatore modulo: restituisce il resto di una divisione intera, quindi 10 % 3 vale 1. Il risultato prende il segno dell'operando sinistro (-7 % 3 vale -1). Per i float usa fmod(), e % 0 lancia un DivisionByZeroError.
Come elevo un numero a potenza in PHP?
Usa l'operatore **: 2 ** 10 vale 1024. È associativo a destra, quindi 2 ** 3 ** 2 è 2 ** 9 = 512, e lega più del meno unario, quindi -2 ** 2 vale -4. La funzione pow(2, 10) fa lo stesso.
Qual è la differenza tra $i++ e ++$i in PHP?
Entrambi aggiungono 1 a $i. $i++ (post-incremento) restituisce il vecchio valore e poi incrementa; ++$i (pre-incremento) incrementa prima e restituisce il nuovo valore. Su una riga a sé, come il passo di un ciclo for, non c'è differenza.