Menu

Operador ternário PHP: ?: abreviado e ternário aninhado

O operador ternário do PHP é um if/else de uma linha: $result = $condition ? 'yes' : 'no';. Veja o ternário curto ?: (operador Elvis), como ele difere do ??, por que ternários aninhados precisam de parênteses desde o PHP 8 e quando o match é a opção mais limpa.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

O operador ternário é um if/else que cabe numa expressão: condition ? valueIfTrue : valueIfFalse. Ele retorna um dos dois valores, então você pode atribuí-lo, dar echo ou passá-lo para uma função.

Mude $age para 15 e $items para 3 e rode de novo. Repare nos parênteses em volta do ternário na última linha: sem eles, o . juntaria as strings primeiro e o resultado não seria o que você quer.

Ternário em templates HTML

Um ternário é o jeito comum de escolher uma classe CSS, um rótulo ou um atributo dentro de um template. Este bloco lê ?stock= da URL: rode-o, clique nos links da aba Page e o mesmo script roda de novo com outro valor.

<?= ... ?> é a forma curta de <?php echo ... ?>, o que mantém condições de uma linha legíveis dentro da marcação.

Ternário curto ?: (o operador Elvis)

Deixe de fora a parte do meio e você tem $a ?: $b: ele retorna $a quando $a é verdadeiro, senão $b. É prático para valores padrão quando uma string vazia ou 0 também devem cair no padrão.

Os valores falsos são false, 0, 0.0, "", "0", [] e null. Se "0" for uma resposta válida nos seus dados (um campo de quantidade, um PIN), o ternário curto vai descartá-lo.

?: ou ??

Eles se parecem, mas verificam coisas diferentes. ?: cai no padrão quando o lado esquerdo é falso. ?? cai no padrão só quando o lado esquerdo é null ou não está definido, e não avisa sobre uma variável ou chave de array ausente.

Use ?? para "o valor pode não existir" (dados da requisição, arrays de configuração, chaves opcionais). Use ?: para "o valor existe, mas pode estar vazio". A página sobre o operador de coalescência nula explica ?? e ??= em detalhe.

Ternário aninhado precisa de parênteses

O PHP 7 lia a ? b : c ? d : e da esquerda para a direita, ao contrário de quase todas as outras linguagens, e isso produzia resultados errados. O PHP 8 se recusa a adivinhar:

<?php
echo $score > 90 ? "A" : $score > 80 ? "B" : "C";
PHP Fatal error:  Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /home/index.php on line 2

Coloque parênteses em volta do ternário interno e funciona:

O ternário curto é a exceção: $a ?: $b ?: $c é permitido sem parênteses, como no exemplo do Elvis acima.

Use match(true) quando houver mais de dois ramos

Um ternário aninhado com três ou quatro níveis é difícil de ler mesmo com parênteses. O match com true como sujeito verifica as condições de cima para baixo e retorna o primeiro braço que bate:

Guarde o ternário para dois resultados numa linha, e passe para match ou uma cadeia if/elseif assim que precisar de um terceiro.

Perguntas frequentes

O que é o operador ternário no PHP?

Uma forma curta de if/else que retorna um valor: $label = $age >= 18 ? 'adult' : 'minor';. Se a condição antes do ? for verdadeira, vale a expressão depois do ?, senão a que vem depois do :.

O que significa ?: no PHP?

$a ?: $b é o ternário curto (também chamado de operador Elvis). Ele retorna $a se $a for verdadeiro e $b caso contrário, então '' ?: 'default' é 'default'. É o mesmo que $a ? $a : $b, mas $a é avaliado só uma vez.

Dá para aninhar operadores ternários no PHP?

Só com parênteses. Desde o PHP 8, $a ? 'x' : $b ? 'y' : 'z' é um erro fatal, então escreva $a ? 'x' : ($b ? 'y' : 'z'). Para mais de dois ramos, match(true) ou uma cadeia if/elseif é mais fácil de ler.

Posso usar um ternário sem a parte do else?

Não, o ternário sempre precisa dos dois ramos. Para "use este valor ou um padrão", escreva $x ?: 'default' ou $x ?? 'default'; para só fazer algo quando uma condição vale, escreva um if normal ou $condition && doSomething();.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR