xor
A palavra-chave xor no PHP é um operador lógico que retorna TRUE se apenas uma das duas expressões for TRUE e a outra for FALSE.
Introdução
A palavra-chave xor no PHP é o operador lógico ou-exclusivo. Ela retorna TRUE apenas quando exatamente um dos seus dois operandos é TRUE e o outro é FALSE. Se ambos os operandos forem TRUE, ou ambos forem FALSE, então xor retorna FALSE. Essa é a principal diferença em relação ao operador or, que retorna TRUE sempre que um ou ambos os operandos forem TRUE.
Em termos simples: xor responde à pergunta "um desses é verdadeiro, mas não ambos?"
Esta página aborda a tabela verdade do xor, um exemplo executável, sua precedência (e a armadilha comum de atribuição que ela causa), e quando faz sentido usar xor.
Tabela verdade
O comportamento do xor é descrito completamente por estes quatro casos:
$a | $b | $a xor $b |
|---|---|---|
TRUE | TRUE | FALSE |
TRUE | FALSE | TRUE |
FALSE | TRUE | TRUE |
FALSE | FALSE | FALSE |
Observe que o resultado é TRUE apenas nas duas linhas "mistas" — é isso que o torna exclusivo.
Exemplo
Aqui está um exemplo que demonstra o uso do xor no PHP:
Exemplo da palavra-chave xor no PHP
No exemplo acima, a instrução if será avaliada como TRUE porque $x > 0 é TRUE e $y > 10 é FALSE. Portanto, a saída do código será: "One of the expressions is true and the other is false".
Vale notar que xor tem uma precedência menor do que os operadores and e or, por isso é importante usar parênteses para agrupar expressões adequadamente quando necessário.
Precedência e a armadilha de atribuição
Os operadores por palavra and, or e xor têm precedência menor do que o operador de atribuição (=). Isso pega as pessoas de surpresa: em $result = true xor false, a atribuição é ligada primeiro, então o PHP avalia como ($result = true) xor false. O xor é aplicado depois que o valor já foi atribuído, e seu resultado é descartado.
<?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)A regra prática: quando você quer que o resultado de uma expressão xor seja armazenado em uma variável, envolva a expressão em parênteses. Se você só precisa do xor dentro de uma condição if (como no exemplo acima), o problema não ocorre.
Para a tabela de precedência completa e os operadores simbólicos (&&, ||, !), consulte Operadores PHP.
Mais Informações
Aqui estão mais informações sobre o operador xor no PHP:
- O operador
xortambém é chamado de operador "ou exclusivo" porque retornaTRUEapenas se uma das expressões forTRUEe a outra forFALSE, mas não se ambas foremTRUEou ambas foremFALSE. - O operador
xorconverte automaticamente seus operandos em valores boolean antes da avaliação, seguindo as regras padrão de coerção de tipos do PHP. - O operador
xorpode ser útil em situações em que você precisa verificar que apenas uma de duas condições é verdadeira, mas não ambas. Por exemplo, se você tem duas caixas de seleção em um formulário e quer garantir que o usuário selecione apenas uma delas, pode usarxorpara validar a entrada. - Ao contrário de
andeor, o operadorxornão realiza curto-circuito; ambos os operandos são sempre avaliados independentemente do valor do primeiro operando. - O operador
xorpode ser combinado com outros operadores como==ou!=para criar expressões mais complexas. Por exemplo, você pode usar($x == $y) xor ($a != $b)para verificar que ou$xé igual a$you$anão é igual a$b, mas não ambos. Tais expressões são mais frequentemente colocadas dentro de uma instruçãoif. - Note que
xoré um operador lógico. Para operações XOR bit a bit (alternar bits individuais de um inteiro), use o operador^em vez disso. - Os operadores por palavra relacionados são
andeor. O PHP também fornece as formas simbólicas&&e||, que têm maior precedência do que seus equivalentes por palavra. - Vale notar que o operador
xornão é comumente usado na programação PHP, e você pode descobrir que pode obter os mesmos resultados usando outros operadores ou estruturas de controle. No entanto, pode ser uma ferramenta útil em certas situações onde você precisa realizar operações lógicas em valores boolean.