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();.