Gli operatori in PHP
Assegnazione
In PHP, l'assegnazione avviene da destra a sinistra, ovvero il valore a destra è assegnato alla variabile a sinistra:
// Qui $a è null
$a = 1;
// Qui $a è 1
$b = $a;
// Qui sia $a sia $b valgono 1
L'operatore di assegnazione è
=.
È possibile assegnare lo stesso valore a più variabili in un'unica operazione:
Il risultato sarà 11 (non undici, ma due singoli uno di seguito).
Inoltre, il risultato di un'operazione di assegnazione è il valore stesso:
$a = ($b = 5) + 4; // ora $a vale 9 e $b vale 5
Confronto
L'operatore ==
NOTA: uno degli errori più comuni è quello di utilizzare = (singolo) come operatore di confronto; in C (e nei linguaggi derivati, come il php) un'istruzione come if($a = $b) è perfettamente legittima: si assegna il valore di $b ad $a, e se l'operazione va bene (cioè sempre) è restituito vero.
L'operatore di confronto è un doppio uguale
==.
$a =
1;
$b =
2;
if($a ==
$b)
echo "uguali";
else
echo "diversi";
Questo script restituirà "diversi".
L'operatore = (assegnazione) ha la precedenza sull'operatore == (confronto):
$a = 1; $b = 2;
if($a == $b = 1)
else
Questo script restituirà "uguali", in quanto alla riga 2 prima è eseguito $b = 1 e poi $a == $b.
L'operatore !=
L'operatore != verifica che due valori siano diversi:
NOTA: oltre a != è possibile utilizzare l'operatore <>
$a = 1;
$b = 2;
if($a != $b)
echo "I valori sono diversi";
L'uso del ! per negare un valore booleano
Si può utilizzare il punto esclamativo da solo per negare un valore booleano o il casting corrispondente:
$a = true;
if(!$a)
$b = 0;
if(!$b)
In questo caso comparirà solo la scritta "$b è falso".
L'operatore ===
Tabella sull'uso di === | |
stesso tipo |
tipo diverso |
| stesso valore |
vero |
falso |
| valore diverso |
falso |
falso |
Un altro operatore di confronto è ===. Questo operatore controlla che i due valori da confrontare siano uguali, e controlla che lo sia anche il tipo.
PHP infatti fa il
casting automatico dei tipi, cioè - per esempio - se si aspetta un valore booleano (vero/falso) e il valore è numerico, effettua una conversione automatica e implicita:
$a = 5;
$b = 0;
if($a == true)
if($b) // è come scrivere $b == true
In questo esempio sia $a sia $b sono numerici, ma i rispettivi valori sono convertiti in vero/falso, in quanto
if si aspettava un valore booleano.
In particolare, 0 (zero) è convertito in falso e non-0 è convertito in vero.
L'operatore === non permette questo:
$a = true;
$b = 0;
$c = -1;
if($a === true)
if($b === true)
if($c === true)
In questo caso $a è vero, $b non sarebbe vero nemmeno con il casting implicito, mentre $c sarebbe vero se il confronto fosse fatto con ==, ma non lo è, dato che il confronto tramite === verifica che il dato presente in $c sia booleano.
L'operatore !==
L'operatore !== restituisce vero se O il tipo è diverso O il valore è diverso O entrambe le cose:
$a = true;
$b = 0;
$c = -1;
if($a !== true)
if($b !== true)
if($c !== true)
In questo caso $a è sia un booleano sia vero, di conseguenza non comparirà la scritta "$a non è vero!".
$b è numerico, e anche se ha un valore corrispondente a false comparirà lo stesso la scritta "$b non è vero!".
$c è numerico e inoltre non è booleano, quindi comparirà la scritta "$c non è vero!".
Gli operatori <, >, <=, >=
Nota bene: il contrario di maggiore non è minore, ma minore o uguale!
Gli operatori > (maggiore), < (minore), >= (maggiore o uguale), <= (minore o uguale) permettono di confrontare due numeri per determinare quale è il maggiore o il minore.
$a = 1;
$b = 5;
if($a < $b)
Nota: utilizzando anche gli operatori and e or, invertendo la direzione del confronto occorre anche cambiare and in or e viceversa.
if($a < $b && $c < $d)
"caso 1";
if($a >= $b || $c >= $d)
"caso 2";
Solo in questo modo si è sicuri di comprendere il 100% dei casi possibili.
Gli operatori aritmetici
+ - * / %
NOTA: L'operatore + può essere utilizzato anche per unire due matrici
Gli operatori sono
+ per la somma,
- per la sottrazione,
* per la moltiplicazione,
/ per la divisione e
% per il resto della divisione.
Gli operatori +, -, *, / si applicano indifferentemente a numeri interi e con la virgola, mentre l'operatore di resto della divisione si applica solo a numeri interi.
Se si effettua una divisione tra numeri interi il risultato può essere un numero con la virgola (parsing automatico).
Esempi:
$a = 1;
$b = 2;
echo $a +
$b;
// mostra 3
$a = 1;
$b = 0.5;
echo $a +
$b;
// mostra 1.5, considerando anche $a un numero con virgola
$a = 22;
$b = 5;
echo $a %
$b;
// mostra 2, dal momento che 22 / 5 dà 4 con il resto di 2
$a = 22;
$b = 3.8;
echo $a %
$b;
// mostra 1, poiché tronca 3.8 in 3
$a = 22;
$b = 0;
echo $a /
$b;
// restituisce un errore
Per una breve ma esauriente trattazione del problema della divisione per zero, consultare il sito di wikipedia alla voce
divisione per zero∞
Gli operatori di incremento e decremento
Nei linguaggi derivati dal
C, sono disponibili un operatore di incremento e uno di decremento, rispettivamente
++ e
--.
L'operatore, posto prima o dopo la variabile, la incrementa o la decrementa:
Se un operatore di incremento è utilizzato in un'istruzione complessa, è importante valutare se l'operatore è prima o dopo la variabile.
Se è prima, l'incremento è calcolato prima dell'esecuzione dell'istruzione, altrimenti dopo:
$a = 5;
echo $a++;
// mostra 5 e incrementa $a
$a = 5;
echo ++
$a;
// incrementa $a e mostra 6
Gli operatori aritmetici riferiti alla variabile stessa
Oltre all'operatore di incremento, è possibile utilizzare un segno aritmetico (+, -, *, /, %), uno di operazioni a bit (&, |; ~; >>; <) o il concatenamento di stringhe (.), seguito da un uguale (=) per effettuare un'operazione in cui il primo termine è la variabile stessa.
$a = 7;
$a += 5; // $a vale 12
// equivale a $a = $a + 5;
$a /= 3; // $a vale 4
// equivale a $a = $a / 3;
$a %= 3; // $a vale 1
// equivale a $a = $a % 3;
$a >>= 1; // $a vale 1, in quanto lo shift a destra equivale a una divisione per due con perdita del resto
// equivale a $a = $a >> 1;
$a .= " pinta"; // $a vale "1 pinta";
// equivale a $a = $a . " pinta";
Operatori bitwise (bit a bit)
Un numero è memorizzato come sequenza di
bit, in cui il primo vale 1, il secondo 2, il terzo 4 eccetera.
Per esempio, il numero 25.901 è memorizzato come 0110010100101101.
Se si mette il numero binario in una griglia in cui il valore più a destra è 1, il secondo 2 e così via, e poi si sommano i valori "1", si ottiene il valore decimale del numero:
Conversione di 25.901 da binario a decimale
| 32768 |
16384 |
8192 |
4096 |
2048 |
1024 |
512 |
256 |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
| 0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
1+4+8+32+256+1.024+8.192+16.384 = 25.901
Gli operatori bit-a-bit (detti
bitwise) servono ad applicare operazioni binarie ai numeri.
Il motivo principale per cui si usano delle operazioni bitwise è di performance, e di solito sono usate su operazioni ripetitive e numerose.
L'operatore bitwise &
L'operatore & (
AND) è utilizzato per confrontare i bit di due numeri: il risultato riporterà 1 solo sui singoli bit che sono 1 in entrambi i numeri:
$a = 12345; // in codice binario a 16 bit è 0011000000111001
$b = 54321; // in codice binario a 16 bit è 1101010000110001
echo $a &
$b;
// il risultato è 0001000000110001 in decimale, cioè 4.145
L'operatore bitwise |
L'operatore | (
OR) è utilizzato per confrontare i bit di due numeri: il risultato riporterà 1 sui singoli bit che sono 1 in almeno uno dei numeri:
$a = 12345; // in codice binario a 16 bit è 0011000000111001
$b = 54321; // in codice binario a 16 bit è 1101010000110001
echo $a |
$b;
// il risultato è 1111010000111001 in decimale, cioè 62.521
L'operatore bitwise ^
L'operatore ^ (
XOR) è utilizzato per confrontare i bit di due numeri: il risultato riporterà 1 sui singoli bit che sono 1 in almeno uno dei numeri, ma non in entrambi:
$a = 12345; // in codice binario a 16 bit è 0011000000111001
$b = 54321; // in codice binario a 16 bit è 1101010000110001
echo $a ^
$b;
// il risultato è 1110010000001000 in decimale, cioè 58.377
L'operatore XOR è molto usato in
crittografia.
L'operatore bitwise ~
L'operatore ~ (
NOT) è utilizzato per invertire i bit di due numeri: il risultato riporterà 1 sui singoli bit che sono 0 e viceversa:
$a = 12345; // in codice binario a 16 bit è 0011000000111001
echo ~
$a;
// il risultato è 1100111111000110 in decimale, cioè 53.190 (in realtà, dal momento che PHP non usa per default numeri a 16 bit, il risultato sarà -12.345
Gli operatori di shift
L'operatore >> sposta tutti i bit a destra di una posizione; viceversa l'operatore < li sposta a sinistra di una posizione.
Questo equivale rispettivamente a dividere (perdendo il resto) e moltiplicare per due:
$a = 12345; // in codice binario a 16 bit è 0011000000111001
$b = $a << 2; // si applica uno shift a sinistra di due posizioni, che è come moltiplicare per due due volte
echo $b;
// mostrerà 1100000011100100 in decimale, cioè 49.380, cioè 12.345 * 2 * 2
L'operatore di controllo degli errori @
L'operatore @ impedisce che sia visualizzato l'eventuale errore generato dalla funzione che segue.
Per esempio:
$a = @(7/0); // non sarà visualizzato il messaggio di errore di divisione per zero
oppure:
$risorsa =
mysql_connect("server_non_esistente");
// non mostra il messaggio di server non raggiungibile
o anche:
$oggetto = @new oggetto(); // se la creazione di un'istanza dell'oggetto fallisce non mostra errori
Operatore di esecuzione ``
Tutto quello che è racchiuso tramite `` (Non sono apostrofi, ma caratteri
backticks) è eseguito come da una shell.
NOTA: la correttezza dell'esecuzione dipende dal sistema operativo su cui è eseguito il php!
Esempio:
$file = `cat ciao.txt`;
echo $file;
// mostra lo stdout del comando cat ciao.txt
Questo operatore è abilitato solo se non è abilitata modalità sicura ed è disabilitata shell_exec().
Gli operatori logici
AND
L'operatore logico
and (&&) restituisce vero solo se tutti i termini sono veri (cioè basta che uno solo dei suoi termini sia falso perché l'espressione sia falsa).
La tabella della verità con due termini è:
| Condizione 1 |
Condizione 2 |
Risultato |
| V |
V |
V |
| V |
F |
F |
| F |
V |
F |
| F |
F |
F |
Esempio:
$cioccoBuona = true;
$lavoroStanca = true;
if($cioccoBuona && $lavoroStanca) {
echo "Hai le idee chiare!";
// sarà mostrato questo messaggio, perché entrambi i termini sono veri
}
$politicoOnesto = false;
if($cioccoBuona && $politicoOnesto) {
echo "Credici!";
// non sarà mostrato questo messaggio, perché uno dei termini è falso
}
OR
L'operatore logico
or (||) restituisce vero se almeno uno dei termini è vero (cioè bisogna che tutti i suoi termini siano falsi perché l'espressione sia falsa).
La tabella della verità con due termini è:
| Condizione 1 |
Condizione 2 |
Risultato |
| V |
V |
V |
| V |
F |
V |
| F |
V |
V |
| F |
F |
F |
Esempio:
$cioccoBuona = true;
$politicoOnesto = false;
if($cioccoBuona || $politicoOnesto) {
echo "Almeno una è vera!";
// sarà mostrato questo messaggio, perché uno dei termini è vero
}
$elefanteVola = false;
if($elefanteVola || $politicoOnesto) {
echo "Credi anche a Babbo Natale?";
// non sarà mostrato questo messaggio, perché entrambi i termini sono falsi
}
NOT
L'uso dell'operatore
not (!) è stato trattato sopra
XOR
L'operatore logico
xor restituisce vero se almeno uno dei termini è vero, ma non tutti.
La tabella della verità con due termini è:
| Condizione 1 |
Condizione 2 |
Risultato |
| V |
V |
F |
| V |
F |
V |
| F |
V |
V |
| F |
F |
F |
Esempio:
$cioccoBuona = true;
$politicoOnesto = false;
if($cioccoBuona || $politicoOnesto) {
echo "Almeno una è vera!";
// sarà mostrato questo messaggio, perché uno dei termini è vero, ma non entrambi
}
$lavoroStanca = true;
if($cioccoBuona && $lavoroStanca) {
echo "Magari!";
// non sarà mostrato questo messaggio, perché entrambi i termini hanno lo stesso valore (vero)
}
L'operatore di concatenazione di stringhe
L'operatore di concatenazione di stringhe è
.
Esempio:
$a = "La pappa ";
$b = "è buona";
echo $a .
$b;
// mostrerà "La pappa è buona" (senza virgolette)
Operatori su matrici
+
L'operatore + unisce due matrici, preservando tutti i valori (ma eliminando le chiavi duplicate).
Esempio:
$a =
array("fusilli",
"spaghetti",
"stelline");
$b =
array("pomodori",
"melanzane");
var_dump($a +
$b);
// tutti i valori di $a e solo quelli di $b che non hanno chiavi in comune con $a
var_dump($b +
$a);
// tutti i valori di $b e solo quelli di $a che non hanno chiavi in comune con $b
I risultati sono:
array(3) {
[0]=>
string(7) "fusilli"
[1]=>
string(9) "spaghetti"
[2]=>
string(8) "stelline"
}
array(3) {
[0]=>
string(8) "pomodori"
[1]=>
string(9) "melanzane"
[2]=>
string(8) "stelline"
}
=== e ==, !== e !=
== e != confrontano i valori presenti nei due array, === e !== confrontano i valori, le chiavi, l'ordine e i tipi presenti nei due array:
NOTA: oltre a != è possibile utilizzare l'operatore <>
$a =
array("5" =>
"Cinque",
"6" =>
"Sei");
$b =
array(5 =>
"Cinque",
6 =>
"Sei");
$c =
array("6" =>
"Sei",
"5" =>
"Cinque");
if($a == $b) {
echo "gli array hanno gli stessi valori";
// questo messaggio sarà visualizzato
}
if($a == $c) {
echo "gli array hanno gli stessi valori";
// questo messaggio sarà visualizzato
}
if($a === $b) {
echo "gli array hanno gli stessi valori";
// questo messaggio NON sarà visualizzato in quanto i tipi delle chiavi sono diversi
}
if($a === $c) {
echo "gli array hanno gli stessi valori";
// questo messaggio NON sarà visualizzato in quanto l'ordine delle chiavi è diverso
}
L'operatore ternario
L'operatore ternario è un operatore che permette di sintetizzare un'istruzione if...then...else.
La condizione è posta a sinistra di un
?, il valore se vero è posto tra ? e
: e il valore se falso tra : e il
; finale.
Esempio:
$a = 5;
if($a < 10) {
echo $a .
" è un numero piccolo";
} else {
echo $a .
" è un numero grande";
}
// può essere espresso tramite l'operatore ternario:
echo $a <
10 ?
$a .
" è un numero piccolo" :
$a .
" è un numero grande";
Riferimenti
Il forum su PHP∞
Categories
PHP
Non ci sono commenti. [Aggiungere un commento]