Gli operatori di confronto, come suggerisce il loro nome, permettono di confrontare due valori. Può essere interessante vedere la tabella di raffronto dei tipi, dato che mostra esempi di vari confronti tra i tipi di variabili.
Esempio | Nome | Risultato |
---|---|---|
$a == $b | Uguale | TRUE se $a è uguale a $b dopo la manipolazione dei tipi. |
$a === $b | Identico |
TRUE se $a è uguale a $b, ed sono dello stesso
tipo.
|
$a != $b | Diversi | TRUE se $a è diverso da $b dopo la manipolazione dei tipi. |
$a <> $b | Diversi | TRUE se $a è diverso da $b dopo la manipolazione dei tipi. |
$a !== $b | Non identici |
TRUE se $a è diverso da $b, o se non sono dello stesso
tipo.
|
$a < $b | Minore | TRUE se $a è strettamente minore di $b. |
$a > $b | Maggiore | TRUE se $a è strettamente maggiore di $b. |
$a <= $b | Minore o uguale | TRUE se $a è minore o uguale a $b. |
$a >= $b | Maggiore o uguale | TRUE se $a è maggiore o uguale a $b. |
Se si confrontano interi con stringhe o il confronto coinvolge stringhe numeriche, ogni stringa viene convertita in numero e il confronto è effettuato sui numeri. Queste regole valgono anche per l'istruzione switch. La conversione di tipo non avviene quando il confronto è === o !== dal momento che ciò include anche il confronto del tipo.
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
switch ("a") {
case 0:
echo "0";
break;
case "a": // mai raggiunta perché "a" è già riconosciuta come 0
echo "a";
break;
}
?>
Se i tipi di operandi utilizzati differiscono, il confronto viene svolto nell'ordine indicato della seguente tabella.
Tipo dell'operando 1 | Tipo dell'operando 2 | Risultato |
---|---|---|
null oppure string | string | Si converte NULL in "", confronto numerico o lessicale |
bool oppure null | qualsiasi | Convertito in bool, FALSE < TRUE |
object | object | Le classi predefinite possono avere la propria funzione di confronto, classi differenti non sono confrontabili, classi uguali confrontano le proprietà nello stesso modo delle matrici (PHP 4), PHP 5 ha il suo metodo di confronto. |
string, resource oppure number | string, resource oppure number | Stringhe e risorse sono converti in numeri, confronto matematico |
array | array | La matrice con meno membri è più piccola, se la chiave dell'operando 1 non si trova nell'operando 2 allora le matrici non si possono confrontare, in altri casi il confronto avviene valore per valore (vedere l'esempio seguente) |
array | qualsiasi | array è sempre più grande |
object | qualsiasi | object è sempre più grande |
Example #1 Trascrizione del confronto standard tra matrici
<?php
// Le matrici vengono confrontate come illustrato in questa funzione
function standard_array_compare($op1, $op2)
{
if (count($op1) < count($op2)) {
return -1; // $op1 < $op2
} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return null; // uncomparable
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
?>
Vedere anche strcasecmp(), strcmp(), Array operators, e la sezione del manuale su Types.
A causa del modo in cui i float sono rappresentati internamente al PHP, non si dovrebbe esaminare l'eguaglianza di due float.
Per maggior informazioni, fare riferimento alla documentazione del tipo float.
Un altro operatore condizionale è l'operatore ternario "?:".
Example #2 Assegnazione di un valore di default
<?php
// Esempio di utilizzo dell'operatore ternario
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// La riga precedente è simile a
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
TRUE
, e
espressione3 se
espressione1 è FALSE
.
Dal PHP 5.3, è possibile tralasciare l'elemento centrale dell'operatore
ternario. L'espressione espressione1 ?: espressione3 restituisce
espressione1 se espressione1
è TRUE
, e espressione3 in caso contrario.
Nota: Si noti che l'operatore ternario è un'istruzione, e non viene valutato come variabile, ma come risultato di un'istruzione. Questo è importante da sapere nel caso si desideri restituire una variabile per riferimento. La riga return $var == 42 ? $a : $b; in una funzione che restituisce per riferimento non funzionerà e, nelle ultime versioni di PHP, genererà un avvertimento.
Nota:
si raccomanda di non sovrapporre le espressioni ternarie. Il comportamento di PHP quando si usa più di un operatore ternario nella stessa istruzione non è ovvio:
Example #3 Comportamento ternario non ovvio
<?php
// a prima vista, questa istruzione dovrebbe restituire 'true'
echo (true?'true':false?'t':'f');
// invece, il risultato è 't'
// perché le espressioni ternarie sono valutate da sinistra a destra
// quanti segue è una versione più chiara dello stesso codice
echo ((true ? 'true' : false) ? 't' : 'f');
// si può notare che la prima espressione è 'true', che
// a sua volta diventa (bool)true, e quindi restituisce il ramo true della
// seconda espressione ternaria.
?>