Pular para o conteúdo

Como remover if-else do seu código PHP

Retorno antecipado, enum e match: três jeitos de desmontar cadeia de if-else no PHP 8. Revisei o post de 2023, corrigi os erros dele e troquei o switch por match.

Jefferson Oliveira · autor

AI Engineer · Studio Visual (abre em nova aba)

Publicado em

Atualizado em · 4 min de leitura

Escrito e revisado por Jefferson Oliveira. Os exemplos são os do post original de 2023, corrigidos e atualizados pro PHP 8.1.

Toda função que cresceu demais tem a mesma cara: um if dentro de outro, um else no fim e três jeitos de sair. Quem lê precisa guardar todas as condições na cabeça pra saber o que volta. Escrevi este post em 2023 com três saídas pra isso. Duas continuam iguais. A terceira eu trocaria.

Retorno antecipado

Começa pelo caso mais comum, uma função que pergunta se o usuário é admin:

User.php · antes
public function isAdmin($user) {    if (isset($user->role)) {        if ($user->role === 'admin') {            return 'user is administrator';        } else {            return 'user is not administrator';        }    } else {        return 'role does not exist';    }}

Dois níveis de if e dois else pra responder sim ou não. Invertendo as condições, cada exceção sai logo no começo e o caminho principal fica na última linha, sem indentação:

User.php · depois
public function isAdmin(object $user): string{    if (! isset($user->role)) {        return 'role does not exist';    }    if ($user->role !== 'admin') {        return 'user is not administrator';    }    return 'user is administrator';}

Jefferson Oliveira // na prática

Retorno antecipado e guard clause estão no arquivo de preferências que todo agente de IA que escreve código comigo lê, logo ao lado de “evite else aninhado”. É a regra que mais aparece nas revisões que eu faço do código que eles geram.

Enum no lugar da escada de else if

Agora uma função que traduz o código de status de um pedido em nome:

Cart.php · antes
public function getStatusPayment($cart) {    if (isset($cart->status)) {        if ($cart->status === 0) {            return 'Pending';        } else if ($cart->status === 1) {            return 'Paid';        } else if ($cart->status === 2) {            return 'Delivered';        } else if ($cart->status === 3) {            return 'Shipped';        } else if ($cart->status === 4) {            return 'Canceled';        }    }}

Talvez você diga que ninguém escreve código assim. Escreve, e bastante. Um valor que vira outro é o caso clássico de enum. Desde o PHP 8.1 o enum pode ter valor próprio, e a busca já vem pronta:

StatusPayment.php
enum StatusPayment: int{    case Pending   = 0;    case Paid      = 1;    case Delivered = 2;    case Shipped   = 3;    case Canceled  = 4;}
Cart.php · depois
public function getStatusPayment(object $cart): string{    if (! isset($cart->status)) {        return 'status not defined';    }    return StatusPayment::tryFrom($cart->status)?->name        ?? 'status does not exist';}

Jefferson Oliveira // onde eu errei

Na versão de 2023, o getStatusPayment novo checava $cart->state, enquanto o código de antes usava $cart->status, e a última linha estava sem ponto e vírgula. Pior: escrevi um getLabelByCode com array_column e array_search pra fazer o que o tryFrom() já fazia.

Enum resolve quando a lista é fixa. Se o status vem de uma tabela que alguém edita pelo painel, o lugar dele é o banco.

match no lugar do switch

O terceiro caso é uma sequência de if comparando sempre a mesma variável, um por meio de pagamento: cartão de crédito, boleto, débito e pix. Em 2023 eu sugeri switch. Hoje eu iria de match:

Payment.php
public function payment(object $payment): string{    if (! isset($payment->method)) {        return 'payment not defined';    }    return match ($payment->method) {        'credit_card' => $this->payWithCreditCard($payment),        'ticket'      => $this->payWithTicket($payment),        'debit_card'  => $this->payWithDebitCard($payment),        'pix'         => $this->payWithPix($payment),        default       => 'payment method not supported',    };}

A diferença que mais pesa é a comparação. O switch usa ==, então a string “1” e o inteiro 1 caem no mesmo case [3]. O match usa ===. E cada braço já devolve o valor, sem break esquecido no meio.

Jefferson Oliveira // o detalhe que eu gosto

Sem o default, um meio de pagamento novo que ninguém tratou lança erro. O getStatusPayment de 2023 devolvia null calado pro status 5. Prefiro o erro: ele aparece no primeiro teste, e o null só aparece lá na frente, longe da causa.

Quando manter o if

Nem todo if precisa sair. Uma condição simples, sem else e sem aninhamento, se lê de primeira. A meta é reduzir os caminhos que quem lê precisa seguir. A palavra if pode ficar.

Perguntas frequentes

Vários returns na mesma função não é ruim?

Não quando ficam no topo, como guard clauses. O problema é return escondido no meio de lógica longa. No topo, cada um diz logo o que interrompe a função.

match substitui todo switch?

Não. Cada braço do match é uma expressão só. Quando o caso precisa de várias linhas, chame um método, como no exemplo, ou mantenha o switch. Só lembre que ele compara com ==.

Meu projeto ainda está no PHP 7.4. E agora?

Retorno antecipado funciona em qualquer versão. match pede PHP 8.0 e enum pede 8.1. Até lá, uma constante de classe ou um array associativo resolve o caso dos status.

Referências

  1. [1] Documentação oficial · PHP Manual: match (abre em nova aba) php.net/manual/pt_BR/control-structures.match.php
  2. [2] Documentação oficial · PHP Manual: Backed enumerations (abre em nova aba) php.net/manual/pt_BR/language.enumerations.backed.php
  3. [3] Documentação oficial · PHP Manual: switch (abre em nova aba) php.net/manual/pt_BR/control-structures.switch.php
  4. [4] Documentação oficial · PHP Manual: Enumerations (abre em nova aba) php.net/manual/pt_BR/language.enumerations.php

Fontes conferidas em out 2026.

  • PHP
  • Clean code
  • PHP 8

Compartilhar:

LinkedIn (abre em nova aba) X (abre em nova aba)

// quem escreveu

Jefferson Oliveira

AI Engineer · Studio Visual (abre em nova aba) · São Paulo, SP

Trabalho há mais de 5 anos com PHP, Laravel e WordPress, construindo e-commerces, integrações e sistemas internos. Hoje lidero a adoção de IA na Studio Visual (abre em nova aba) e curso MBA em Engenharia de Software na FIAP.

  • PHP: Desenvolvimento Web e POO · 4Linux
  • MBA em Engenharia de Software · FIAP (cursando)
  • Análise e Desenvolvimento de Sistemas · FATEC Zona Leste
  • Liderança e Gestão de Equipes · FGV

Conheça minha trajetória LinkedIn (abre em nova aba) GitHub (abre em nova aba)

Contato

Quer trocar uma ideia? Bora conversar.

Gosto de conversar sobre IA aplicada, PHP e arquitetura de software, seja para trocar experiência, falar de um projeto ou de uma proposta.

joliveiracode@gmail.com

// download iniciado

Currículo a caminho.

O PDF está baixando. Se quiser trocar uma ideia sobre IA aplicada, PHP ou arquitetura, é só chamar.