die() vs exit() em PHP: duplicata ou mundos diferentes? Entendendo de uma vez por todas
Olá, colega! Se você já programou em PHP, certamente já encontrou as misteriosas construções die('Erro!'); ou exit(0);. Ambas param o script — mas por que existem duas palavras diferentes? Seriam apenas sinônimos, como "bug" e "feature"? Ou há algo mais por trás delas?
Spoiler: em 99% dos casos, são a mesma coisa. Mas é justamente no 1% restante que estão as armadilhas que pegam até desenvolvedores experientes. Neste artigo, não vamos apenas repetir a documentação. Vamos analisar erros reais que iniciantes (e não só) cometem, mostrar exemplos vivos de código e dar dicas concretas para escrever de forma mais limpa e segura.
Vamos nessa! 🚀
Mínimo técnico: o que dizem os manuais?
Começando pela base. De acordo com a documentação oficial do PHP, die() e exit() são construções idênticas. Ambas:
- Interrompem imediatamente a execução do script;
- Podem receber uma string (que será exibida antes da parada) ou um número inteiro (código de retorno);
- Chamam todas as funções registradas via
register_shutdown_function().
Historicamente, exit veio da linguagem C, e die veio do Perl. No PHP, eles foram unidos por conveniência. Mas há um detalhe...
A única diferença real (spoiler: quase nunca é necessária)
A diferença existe apenas na sintaxe quando usados sem parênteses. Veja só:
<?php// Isso causará um erro de parsing!// exit "Mensagem";// Já assim — funciona:exit "Mensagem"; // Funciona! (sem parênteses)die "Mensagem"; // Também funciona
// Mas com números inteiros — cuidado:exit 0; // Erro! Número sem parênteses não funcionaexit(0); // Correto?>Como você pode ver, exit e die podem ser chamados sem parênteses se você passar uma string. Mas com código de retorno numérico, os parênteses são obrigatórios. E essa é a única diferença. Na prática, é melhor sempre usar parênteses — assim o código é lido sem ambiguidade.
Top 5 erros fatais com die() e exit()
Agora a parte mais interessante — onde os desenvolvedores mais se queimam. Reuni casos reais do Stack Overflow e da minha própria experiência.
❌ Erro nº1: "Matar" o script sem pensar nos recursos
O problema mais comum é usar die() no meio da execução sem fechar conexões com o banco de dados, arquivos ou sessões.
<?php$db = new mysqli('localhost', 'user', 'pass', 'db');$result = $db->query("SELECT * FROM users");
if (!$result) { die("Erro na consulta: " . $db->error); // ❌ Conexão com o BD não foi fechada!}
// ... trabalho com result ...$db->close();?>Qual o problema? O PHP fechará a conexão quando o script terminar, mas isso nem sempre é instantâneo. Em projetos de alta carga, essas "conexões pendentes" matam a performance.
Como fazer corretamente? Use try-catch ou register_shutdown_function:
<?phpregister_shutdown_function(function() use ($db) { if ($db->ping()) { $db->close(); }});
$db = new mysqli('localhost', 'user', 'pass', 'db');$result = $db->query("SELECT * FROM users");
if (!$result) { // Apenas saia — a shutdown function cuidará do fechamento exit("Erro na consulta: " . $db->error);}?>❌ Erro nº2: Confusão com códigos de retorno
Muitos pensam que exit(0) significa "deu tudo errado". Na verdade, 0 é sucesso, e qualquer valor diferente de zero indica erro.