Operador @ em PHP: o que significa e como evitar armadilhas

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O que está por trás do símbolo @ no PHP? Explicação para iniciantes

\n\n

Se você já revisou código PHP de outras pessoas ou pesquisou no Stack Overflow, provavelmente já viu uma sintaxe estranha: @file_get_contents() ou @mysql_connect(). O que é esse "arroba" mágico antes da função? Para que serve e por que desenvolvedores experientes recomendam evitá-lo?

\n\n

Neste artigo, vamos detalhar o operador de supressão de erros no PHP — o símbolo @. Você aprenderá como ele funciona, em quais situações pode ser usado e, principalmente, quais alternativas ao @ no PHP existem. Vamos lá!

\n\n

O que o operador @ faz no PHP?

\n\n

No PHP, o símbolo @ é o operador de controle de erros (error control operator). Sua única função é suprimir a exibição de erros que ocorrem durante a execução de uma expressão específica.

\n\n

Quando o PHP encontra @ antes de uma função ou expressão, ele define temporariamente o nível de relatório de erros como zero para aquela chamada específica. Quaisquer avisos (warnings), notificações (notices) ou erros fatais não serão exibidos para o usuário.

\n\n

Exemplo simples

\n\n
<?php\n// Tentativa de abrir um arquivo inexistente\n$file = @file_get_contents('arquivo_inexistente.txt');\nif ($file === false) {\n    echo "Arquivo não encontrado, mas o erro foi ocultado!";\n}\n?>
\n\n

Sem o @, o PHP exibiria:

\n\n
Warning: file_get_contents(arquivo_inexistente.txt): failed to open stream: No such file or directory
\n\n

Com o @ — silêncio total. O programa continua funcionando, e nós simplesmente recebemos false.

\n\n

Como funciona o mecanismo de supressão de erros?

\n\n

Internamente, o operador @ altera o valor de error_reporting para 0 durante a expressão atual. Após a execução, o nível é restaurado ao valor original.

\n\n

É importante entender: o erro ainda ocorre. Ele simplesmente não é exibido. Além disso, se for um erro fatal (por exemplo, chamar uma função inexistente), o script ainda será encerrado, mas sem mensagem de erro — e você ficará sem saber o que deu errado.

\n\n
<?php\n// Erro fatal — @ não vai salvar\n@funcao_inexistente(); // Chamada de função que não existe\necho "Este código não será executado";\n?>
\n\n

Resultado: tela branca da morte (white screen of death). Nenhuma informação para depuração.

\n\n

Onde o @ é mais comum?

\n\n

O símbolo @ é frequentemente usado em código legado e projetos antigos. Cenários típicos:

\n\n
    \n
  • Trabalho com arquivos — @fopen(), @unlink()
  • \n
  • Conexão com banco de dados — @mysql_connect() (função obsoleta)
  • \n
  • Requisições HTTP — @file_get_contents($url)
  • \n
  • Gerenciamento de sessões — @session_start()
  • \n
\n\n

Iniciantes costumam usar @ como uma "muleta" para não precisar lidar com as causas reais dos erros. Isso é uma má prática, e veja por quê.

\n\n

Por que @ é prejudicial? 3 principais razões

\n\n

1. Você perde o controle sobre os erros

\n

Ao suprimir um erro, você se impede de corrigi-lo. Em vez de entender por que a função retornou false, você simplesmente ignora o problema. Com o tempo, esses erros "silenciosos" se acumulam e causam bugs inesperados.

\n\n

2. Dificuldade na depuração

\n

Imagine: seu script exibe uma página em branco. Você verifica todos os lugares possíveis, mas não há mensagens de erro. O motivo? O @ escondeu um erro fatal. Você perderá horas procurando exatamente onde está o "arroba".

\n\n

3. Performance

\n

O operador @ torna a execução do código mais lenta. O PHP precisa alternar os modos de relatório de erros e também processa

Blogs

Book Recommendations