Operador ternário no PHP

Artigo que apresenta o funcionamento do operador ternário e do operador ?: do PHP.

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

Lucas disse...

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.

Anônimo disse...

Eu também não sabia dessa forma de abreviação if/else, valeu!