Muitas vezes é necessário realizar comparações rápidas, onde se espera obter um valor ou outro de acordo com uma condição. Para isso, existe o operador ternário e o operador "?:".
Operador Ternário
PHP oferece sintaxe pare utilizar operador ternário. Ele é bastante simples. A sintaxe é a seguinte:
[avaliação condicional] ? [código em caso afirmativo] : [código em caso negativo];
Normalmente ele serve para se obter um valor ou outro, de acordo com uma condição, e imprimir ou atribuir a uma variável. Ou executar uma função ou outra, de acordo com uma condição. Logicamente, tudo que é feito com um operador ternário pode ser feito com uma simples sequência com IF/ELSE.
Exemplo:
$x = 1; $y = ($x == 1) ? 3 : 4;
A segunda linha do código significa: se a variável $x vale 1, então obtenha o valor 3, senão, obtenha 4. Atribua o valor obtido à variável $y.
Isso corresponde ao código:
$x = 1; if ($x == 1) { $y = 3; } else { $y = 4; }
Quase não precisa dizer que o objetivo do operador ternário é tornar um bloco IF/ELSE mais enxuto. Porém, não deve ser executado para qualquer bloco IF/ELSE simples. Em suma, é preciso avaliar se o que é colocado no "resultado em caso afirmativo" ou no "resultado em caso negativo" não sofra expansão. Ou seja, tem que ser algo simples o bastante para você notar que a expressão nunca passará daquilo.
Exemplo de chamada de uma função ou outra:
$x == 1 ? funcao1() : funcao2();
Note que não é preciso atribuir o resultado do operador ternário a uma variável, ou imprimi-la, ou usá-la como parâmetro de outra função. Você tem opção de, simplesmente, executar a função 1 ou 2.
Curiosidade: nem todos sabem, mas o código abaixo é válido:
$x = 4; 5; $y = 6;
A linha 2 (que só tem o número 5), é válida. O número não é impresso, não é atribuído, nem usado pra nada. Ele simplesmente é aceito pela sintaxe do PHP, mas é totalmente ignorado.
Operador ?:
O operador "?:" é um caso especial do operador ternário. Sua sintaxe foi incorporada ao PHP na versão 5.3, e basicamente é a seguinte:
[condição e código em caso afirmativo] ?: [código em caso negativo];
Veja um exemplo prático:
$x = 1; $y = $x ?: 2;
A segunda linha significa: se $x é considerado verdadeiro, obtenha $x, senão obtenha 2. Atribua o valor obtido à variável $y. Como $x é um valor inteiro, ele é considerado verdadeiro caso seja diferente de zero, e é considerado falso caso seja igual a zero.
Ele tem o mesmo significado que o seguinte código usando o operador ternário:
$x = 1; $y = $x ? $x : 2;
Ele é útil para atualizar uma variável, a não ser que ela já tenha valor verdadeiro. Por exemplo, em uma função que recebe um parâmetro opcional (e o valor padrão é null). Você pode optar por utilizar um valor padrão caso seja passado null.
Veja esta função:
function teste($x = 1, $y = 2, $z = 3) { return $x + $y + $z; }
Note que ele tem os 3 parâmetros opcionais. Só que, as vezes, queremos passar um valor diferente para $z, mas gostaríamos que os valores de $x e $y fossem os valores padrão. Neste caso, não existe uma forma de passar o parâmetro $z sem ter que informar manualmente os valores 1 e 2 para $x e $y. Mas a função poderia ser reescrita da seguinte forma:
function teste($x = null, $y = null, $z = null) { return ($x ?: 1) + ($y ?: 2) + ($z ?: 3); }
Agora, para passar um valor para $z, e usar os valores padrão de $x e $y, basta passar null para $x e $y.
3 comentários
Uso muito esse tipo de condição de comparação, mas eu não sabia que é possivel fazer isso:
$y = ($x == 1) ? 3 : 4;
Obrigado.
Pois é, Lucas. O operador em si trabalha como se fosse uma função que retorna um valor ou o outro. É o mesmo que pensar:
$y = ternario($x == 1, 3, 4);
Eu também não sabia dessa forma de abreviação if/else, valeu!
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com