xor
La parola chiave xor in PHP è un operatore logico che restituisce TRUE se una delle due espressioni è TRUE e l'altra è FALSE.
Introduzione
La parola chiave xor in PHP è l'operatore logico OR esclusivo. Restituisce TRUE solo quando esattamente uno dei due operandi è TRUE e l'altro è FALSE. Se entrambi gli operandi sono TRUE, o entrambi sono FALSE, allora xor restituisce FALSE. Questa è la differenza fondamentale rispetto all'operatore or, che restituisce TRUE ogni volta che uno o entrambi gli operandi sono TRUE.
In parole semplici: xor risponde alla domanda "uno di questi è vero, ma non entrambi?"
Questa pagina tratta la tabella di verità di xor, un esempio eseguibile, la sua precedenza (e il classico errore di assegnazione che ne deriva) e quando ha effettivamente senso usare xor.
Tabella di verità
Il comportamento di xor è descritto completamente da questi quattro casi:
$a | $b | $a xor $b |
|---|---|---|
TRUE | TRUE | FALSE |
TRUE | FALSE | TRUE |
FALSE | TRUE | TRUE |
FALSE | FALSE | FALSE |
Il risultato è TRUE solo nelle due righe "miste" — è questo che lo rende esclusivo.
Esempio
Ecco un esempio che dimostra l'uso di xor in PHP:
Esempio della parola chiave xor in PHP
Nell'esempio precedente, l'istruzione if verrà valutata come TRUE perché $x > 0 è TRUE e $y > 10 è FALSE. Pertanto, l'output del codice sarà: "One of the expressions is true and the other is false".
Vale la pena notare che xor ha una precedenza inferiore rispetto agli operatori and e or, quindi è importante usare le parentesi per raggruppare correttamente le espressioni quando necessario.
Precedenza e l'errore di assegnazione
Gli operatori testuali and, or e xor hanno tutti una precedenza inferiore rispetto all'operatore di assegnazione (=). Questo trae in inganno: in $result = true xor false, l'assegnazione ha la precedenza, quindi PHP la valuta come ($result = true) xor false. xor viene applicato dopo che il valore è già stato assegnato e il suo risultato viene scartato.
<?php
// = binds tighter than xor, so this is ($result = true) xor false
$result = true xor false;
var_dump($result); // bool(true) — the xor never affects $result
// Use parentheses to get the value you expect
$result = (true xor false);
var_dump($result); // bool(true)
$result = (true xor true);
var_dump($result); // bool(false)La regola pratica è: quando si vuole memorizzare il risultato di un'espressione xor in una variabile, racchiudere l'espressione tra parentesi. Se si utilizza xor solo all'interno di una condizione if (come nell'esempio precedente), il problema non si presenta.
Per la tabella di precedenza completa e gli operatori simbolici (&&, ||, !), consultare PHP Operators.
Ulteriori informazioni
Ecco alcune informazioni aggiuntive sull'operatore xor in PHP:
- L'operatore
xorè chiamato anche operatore "OR esclusivo" perché restituisceTRUEsolo se una delle espressioni èTRUEe l'altra èFALSE, ma non se entrambe sonoTRUEo entrambe sonoFALSE. - L'operatore
xorconverte automaticamente i suoi operandi in valori boolean prima della valutazione, seguendo le regole standard di type juggling di PHP. - L'operatore
xorpuò essere utile nelle situazioni in cui è necessario verificare che solo una di due condizioni sia vera, ma non entrambe. Ad esempio, se si hanno due checkbox in un form e si vuole assicurarsi che l'utente ne selezioni solo una, è possibile usarexorper validare l'input. - A differenza di
andeor, l'operatorexornon è short-circuit; entrambi gli operandi vengono sempre valutati indipendentemente dal valore del primo operando. - L'operatore
xorpuò essere combinato con altri operatori come==o!=per creare espressioni più complesse. Ad esempio, è possibile usare($x == $y) xor ($a != $b)per verificare che$xsia uguale a$yoppure che$anon sia uguale a$b, ma non entrambe. Tali espressioni vengono solitamente inserite all'interno di un'istruzioneif. - Si noti che
xorè un operatore logico. Per le operazioni XOR bit a bit (che modificano i singoli bit di un intero), utilizzare invece l'operatore^. - Gli operatori testuali correlati sono
andeor. PHP fornisce anche le forme simboliche&&e||, che hanno una precedenza più alta rispetto alle loro controparti testuali. - Vale la pena notare che l'operatore
xornon è comunemente usato nella programmazione PHP e si potrebbe scoprire che è possibile ottenere gli stessi risultati usando altri operatori o strutture di controllo. Tuttavia, può essere uno strumento utile in alcune situazioni in cui è necessario eseguire operazioni logiche su valori boolean.