PHP Lendo Erros
Todo mundo que programa vê mensagens de erro, todos os dias, inclusive quem programa há vinte anos. A diferença é que quem tem experiência lê a mensagem e quem está começando costuma se assustar e fechar a janela. Nesta aula você vai aprender a ler o que o PHP diz quando algo dá errado: que tipo de problema é, o que aconteceu e em que linha. Quase sempre a resposta está escrita ali.
- As quatro partes de toda mensagem do PHP: a gravidade, o que aconteceu, o arquivo e a linha.
- A diferença entre
Parse error,Fatal error,Warning,DeprecatedeNotice, e quais deles param o programa. - Por que a linha indicada às vezes não é a linha do erro (e onde procurar).
- Como conferir a sintaxe sem rodar o programa (
php -l). - O que mudam
display_errorseerror_reporting, no terminal e no navegador. - Os 10 erros mais comuns de quem começa, com a mensagem real e a correção.
Todas as mensagens desta página foram produzidas pelo PHP 8.5 de verdade, no computador da Ana (usuária ana, pasta /home/ana/erros). Elas vêm em inglês, sempre: o PHP não traduz as mensagens. Por isso cada uma ganha tradução aqui.
A ideia: o erro é um bilhete, não uma bronca
Pense na professora que devolve a prova com um bilhete na margem: "Questão 3, linha 2: faltou o sinal de menos". O bilhete diz quão grave é (errou a questão inteira ou só perdeu meio ponto?), o que está errado e onde. Você não precisa adivinhar nada: é só ir até lá e consertar.
A mensagem do PHP é esse bilhete. Veja um programa com um pequeno engano: a variável foi criada como $nome (com n minúsculo), mas foi usada como $Nome (com N maiúsculo). Para o PHP, são duas variáveis diferentes (veja Variáveis).
<?php $nome = "Ana"; echo "Olá, $Nome!\n";
$ php ola.php Warning: Undefined variable $Nome in /home/ana/erros/ola.php on line 3 Olá, !
Anatomia da mensagem
- Warning:
- A gravidade. Warning = "aviso": algo estranho aconteceu, mas o programa continuou. Por isso o
Olá, !apareceu depois. - Undefined variable $Nome
- O que aconteceu: "variável não definida:
$Nome". Você usou uma variável que nunca recebeu valor. - in /home/ana/erros/ola.php
- Em qual arquivo (in = "em"). Num projeto com muitos arquivos, isso importa.
- on line 3
- Em qual linha (on line = "na linha"). Conte as linhas do arquivo: a 1 é o
<?php, a 3 é oecho.
Repare também na linha em branco antes do Warning:: o PHP sempre pula uma linha antes da mensagem, para ela não grudar no que já estava na tela. E repare no resultado: como $Nome não existe, ela valeu "nada", e a frase saiu Olá, !.
Todas as mensagens do PHP seguem esse formato: gravidade: o que aconteceu in arquivo on line N. Quando você souber ler essas quatro partes, já saberá ler 90% dos erros.
Os tipos de mensagem: do mais grave ao mais leve
A primeira palavra da mensagem diz quão sério é o problema e, principalmente, se o programa parou.
| Começa com | Tradução | O programa… | Quando acontece |
|---|---|---|---|
Parse error | erro de análise (de escrita) | nem começa: nenhuma linha roda | O código está escrito de um jeito que o PHP não entende: falta ;, aspas, chaves… |
Fatal error | erro fatal | para naquela linha; o que vinha antes já rodou | O código está bem escrito, mas pede algo impossível: uma função que não existe, dividir por zero… |
Warning | aviso | continua | Algo provavelmente errado: variável que não existe, posição de array que não existe. |
Deprecated | obsoleto | continua | Funciona hoje, mas vai deixar de funcionar numa versão futura do PHP. |
Notice | observação | continua | Um detalhe que talvez seja engano. No PHP 8 sobraram poucos. |
Vamos ver cada um com um exemplo real.
Parse error: o PHP não conseguiu ler o seu código
Antes de executar qualquer coisa, o PHP lê o arquivo inteiro e confere se ele está escrito de acordo com as regras da linguagem (a sintaxe). Esse trabalho se chama parse ("análise"). Se algo não se encaixa, ele desiste e mostra um Parse error. Nenhuma linha roda, nem as que estavam certas:
<?php echo "Linha 1\n"; echo "Linha 2\n"; echo "Linha 3\n" echo "Linha 4\n";
$ php linhas.php Parse error: syntax error, unexpected token "echo", expecting "," or ";" in /home/ana/erros/linhas.php on line 5
Nem a Linha 1 apareceu. A mensagem, traduzida:
- Parse error: syntax error
- "Erro de análise: erro de sintaxe." O código está mal escrito.
- unexpected token "echo"
- "Encontrei um
echoque eu não esperava." Unexpected = inesperado; token = "pedaço" do código (uma palavra, um sinal). - expecting "," or ";"
- "Eu esperava uma vírgula ou um ponto e vírgula." Essa é a dica de ouro: diz exatamente o que faltou.
- on line 5
- O PHP percebeu o problema na linha 5, quando chegou ao
echo. Mas quem esqueceu o;foi a linha 4.
O PHP não sabe onde você queria colocar o ;. Ele só sabe onde percebeu que algo estava errado: no primeiro pedaço que não fazia sentido. Por isso, num Parse error, olhe a linha indicada e a de cima. Nas próximas seções você vai ver os "pedaços inesperados" mais comuns.
O PHP diz unexpected… | Quer dizer que achou… |
|---|---|
token "echo", token "=", token "{" | uma palavra da linguagem ou um sinal |
identifier "Tchau" | uma palavra solta, sem $ nem aspas (identifier = nome) |
variable "$total" | uma variável |
end of file | o fim do arquivo: algo ficou aberto (aspas, parênteses, chaves) até o final |
Fatal error: o programa parou no meio
Aqui o código está bem escrito, então o PHP começa a rodar. Tudo vai bem até uma linha que pede algo impossível. Nesse ponto ele para, e o resto não roda:
<?php echo "Antes\n"; echo $x; echo "Depois\n"; echo naoExiste(); echo "Nunca aparece\n";
$ php parou.php
Antes
Warning: Undefined variable $x in /home/ana/erros/parou.php on line 3
Depois
Fatal error: Uncaught Error: Call to undefined function naoExiste() in /home/ana/erros/parou.php:5
Stack trace:
#0 {main}
thrown in /home/ana/erros/parou.php on line 5
$ echo $?
255
Leia a saída de cima para baixo e você vê a história do programa: Antes saiu; a linha 3 deu um aviso e o programa continuou (Depois saiu); a linha 5 deu um erro fatal e o programa parou (Nunca aparece nunca apareceu). O echo $? mostra o código de saída: 255 é o jeito de o PHP avisar ao terminal "terminei com erro fatal"; um programa que termina bem sai com 0.
A mensagem do erro fatal é maior. Parte por parte:
- Fatal error:
- Erro fatal: o programa parou.
- Uncaught Error:
- "Erro não capturado." No PHP 8, a maioria dos erros fatais é um objeto de erro que o PHP "lança" (throw). Se ninguém o "captura" (catch), o programa para. Você vai aprender a capturar em Exceções (try e catch); por enquanto, leia Uncaught como "e ninguém tratou".
- Call to undefined function naoExiste()
- O que aconteceu: "chamada a uma função não definida:
naoExiste()". - in /home/ana/erros/parou.php:5
- Arquivo e linha, num formato curto:
arquivo:linha. - Stack trace:
- "Rastro da pilha": o caminho de funções que levou até o erro, do mais recente (
#0) ao mais antigo. Aqui o erro aconteceu direto no programa principal ({main}), então o rastro é curto. Ele fica útil quando você tiver funções chamando funções. - thrown in … on line 5
- "Lançado em … na linha 5": repete o lugar, no formato de sempre.
Warning: um aviso, e o programa segue
O aviso é o tipo mais traiçoeiro, justamente porque o programa não para. Ele continua com um valor errado (no exemplo da Ana, a variável inexistente virou "nada") e o resultado sai estranho: Olá, !. Nunca ignore um Warning: ele quase sempre é um engano seu que vai virar um bug.
Deprecated: funciona, mas está com os dias contados
Deprecated quer dizer "desaprovado, obsoleto". É o PHP avisando: "isso ainda funciona, mas uma versão futura vai remover; troque". Acontece muito com códigos antigos copiados da internet. Um exemplo novo do PHP 8.5: os nomes compridos de conversão de tipo, como (integer), viraram obsoletos.
<?php $idade = (integer) "29"; echo $idade, "\n";
$ php idade.php Deprecated: Non-canonical cast (integer) is deprecated, use the (int) cast instead in /home/ana/erros/idade.php on line 2 29
Tradução: "A conversão não padrão (integer) está obsoleta; use a conversão (int) no lugar." O programa funcionou (29 saiu), e a própria mensagem diz como consertar: trocar (integer) por (int). Mensagens Deprecated costumam ser assim, educadas e com a solução. Conversões de tipo são assunto de Conversão de Tipos.
Notice: uma observação
Antigamente o PHP tinha muitos notices; no PHP 8, quase todos viraram Warning. Os que sobraram são raros, por exemplo:
$ php final.php Notice: Only variables should be passed by reference in /home/ana/erros/final.php on line 2 c
Você não precisa entender este agora ("só variáveis deveriam ser passadas por referência"). Guarde só que Notice é o mais leve de todos e que o programa continua. A lista completa de tipos fica em Tipos de Erro.
Missão: clique em Rodar e leia a saída: um aviso e um erro fatal. Depois conserte o programa: a linha 3 deve mostrar o valor de $x (crie a variável antes, com o valor que quiser) e a linha 5 deve chamar a função que existe de verdade, strtoupper ("texto em maiúsculas"). O objetivo é ver Antes, Depois e FIM, sem nenhuma mensagem do PHP.
<?php
echo "Antes\n";
echo $x, "\n";
echo "Depois\n";
echo strtoupperr("fim"), "\n";
<?php
echo "Antes\n";
$x = 10;
echo $x, "\n";
echo "Depois\n";
echo strtoupper("fim"), "\n";
A linha nem sempre é a do erro
O PHP indica a linha onde percebeu o problema, que nem sempre é a linha onde ele está. Isso acontece quase só com Parse error. Veja este arquivo, com duas linhas em branco depois do echo sem ponto e vírgula:
<?php echo "Olá" $x = 1;
$ php longe.php Parse error: syntax error, unexpected variable "$x", expecting "," or ";" in /home/ana/erros/longe.php on line 5
O ; faltou na linha 2, mas o PHP aponta a 5. Para ele, linhas em branco não contam: depois de echo "Olá" veio direto $x, e só ali ele percebeu que faltava algo. A regra prática:
- Vá até a linha indicada.
- Se ela parece certa, suba: olhe a última linha com código antes dela.
- Se a mensagem fala em
end of file(fim do arquivo), procure algo aberto e não fechado: aspas,(,{. Aí o problema pode estar bem longe, lá em cima.
Todo editor de código mostra o número de cada linha na margem esquerda (veja Editores e IDEs). O VS Code também pula direto para uma linha com Ctrl+G. No nano, é Ctrl+_ (ou Alt+G). Com isso, ir até a "line 37" leva dois segundos.
Conferir a escrita sem rodar: php -l
A opção -l (de lint, "fiapo": catar pequenos defeitos) faz o PHP só ler o arquivo e dizer se a sintaxe está certa, sem executar nada. Ela encontra os Parse error, não os outros (para achar um Warning, o programa precisa rodar).
$ php -l linhas.php Parse error: syntax error, unexpected token "echo", expecting "," or ";" in linhas.php on line 5 Errors parsing linhas.php $ echo $? 255 $ php -l ola.php No syntax errors detected in ola.php
No syntax errors detected = "nenhum erro de sintaxe encontrado". Errors parsing = "erros ao analisar". É útil antes de enviar um arquivo para o servidor: um Parse error no ar derruba a página inteira.
Onde a mensagem aparece: terminal × navegador
Até aqui você rodou tudo no terminal (o modo CLI, de command line interface). Quando o mesmo PHP gera uma página web, a mensagem aparece de outro jeito. E, num site de verdade, muitas vezes ela nem aparece. Quem decide isso são duas configurações: display_errors e error_reporting.
display_errors: mostrar ou esconder
display_errors ("exibir os erros") decide se as mensagens vão para a saída do programa: a tela do terminal ou a página que o navegador recebe. Ligado (1 ou On), você vê as mensagens. Desligado (0 ou Off), elas somem, mas o erro continua acontecendo. Você pode mudar só para uma execução com -d ("definir"):
$ php ola.php Warning: Undefined variable $Nome in /home/ana/erros/ola.php on line 3 Olá, ! $ php -d display_errors=0 ola.php Olá, ! « o aviso sumiu, mas o problema continua
Com um erro fatal e display_errors desligado, o resultado é o pior de todos: nada. Nenhuma saída, nenhuma explicação. Só o código de saída denuncia:
$ php -d display_errors=0 parou.php Antes Depois $ echo $? 255 « parou com erro fatal, em silêncio
No navegador: as mesmas mensagens, em HTML
Esta página tem os mesmos dois enganos (a variável $Nome e uma função que não existe):
<?php $nome = "Ana"; echo "<p>Olá, $Nome!</p>\n"; echo "<p>Total: " . contar() . "</p>\n";
Abrindo pelo servidor embutido (php -S localhost:8000), o navegador recebe este HTML:
$ curl -s localhost:8000/pagina.php
<br />
<b>Warning</b>: Undefined variable $Nome in <b>/home/ana/erros/pagina.php</b> on line <b>3</b><br />
<p>Olá, !</p>
<br />
<b>Fatal error</b>: Uncaught Error: Call to undefined function contar() in /home/ana/erros/pagina.php:4
Stack trace:
#0 {main}
thrown in <b>/home/ana/erros/pagina.php</b> on line <b>4</b><br />
A mensagem é a mesma, só que com etiquetas HTML: <b> (negrito) na gravidade, no arquivo e na linha, e <br /> (quebra de linha) no lugar das linhas em branco. No navegador, você vê o texto em negrito, misturado com a sua página. Isso é a configuração html_errors, que vem ligada no modo web e desligada no terminal.
Agora o mesmo servidor, com display_errors desligado (php -d display_errors=0 -S localhost:8000), numa página em que o erro fatal acontece antes de qualquer saída:
<?php $total = contar(); echo "<p>Total: $total</p>";
$ curl -si localhost:8000/pagina2.php
HTTP/1.0 500 Internal Server Error
Host: localhost:8000
Date: Fri, 16 Oct 2026 23:44:39 GMT
Connection: close
X-Powered-By: PHP/8.5.8
Content-type: text/html; charset=UTF-8
« e mais nada: a página veio vazia
Esta é a famosa "tela branca": o navegador recebe o código 500 Internal Server Error ("erro interno do servidor") e uma página vazia (ou a página padrão de erro do navegador). Nenhuma pista. A pista está no registro (log) do servidor. No servidor embutido, o registro é o próprio terminal onde ele está rodando:
[Fri Oct 16 20:44:32 2026] 127.0.0.1:54500 [200]: GET /pagina.php - Uncaught Error: Call to undefined function contar() in /home/ana/erros/pagina.php:4
Stack trace:
#0 {main}
thrown in /home/ana/erros/pagina.php on line 4
Ligado no seu computador, desligado no site no ar
| Onde | display_errors | Por quê |
|---|---|---|
| Seu computador (desenvolvimento) | ligado | Você quer ver cada erro na hora, para consertar. |
| Site no ar (produção) | desligado, com log_errors ligado | A mensagem mostra caminhos de pastas e nomes de arquivos do servidor, informação útil para um invasor. Os erros vão para o registro, que só você lê. |
Essas configurações moram no arquivo php.ini. O comando php --ini mostra qual arquivo está sendo usado, e php -i mostra os valores atuais. No computador da Ana, o PHP não tem php.ini, então vale o padrão de fábrica do terminal: mostrar tudo.
$ php -i | grep -E "^(display_errors|error_reporting|log_errors|html_errors)" display_errors => STDOUT => STDOUT error_reporting => no value => no value html_errors => Off => Off log_errors => Off => Off
STDOUT quer dizer "ligado, na saída normal". error_reporting sem valor quer dizer "o padrão", que no PHP 8 é todos os tipos. No Debian e no Ubuntu, o PHP instalado pelo apt tem um php.ini para o terminal e outro para o servidor web, em /etc/php/8.x/ (veja Instalar no Linux); a versão do servidor web costuma vir com display_errors desligado.
Se display_errors e log_errors estiverem ligados ao mesmo tempo no terminal, o PHP mostra a mensagem na saída e escreve no registro. Sem um arquivo de registro configurado, o registro vai para a saída de erros do terminal, com o prefixo PHP:
$ php -d log_errors=1 ola.php PHP Warning: Undefined variable $Nome in /home/ana/erros/ola.php on line 3 Warning: Undefined variable $Nome in /home/ana/erros/ola.php on line 3 Olá, !
É o mesmo aviso, uma vez só. Se você vir PHP Warning: no seu computador, é essa configuração.
error_reporting: quais tipos contam
error_reporting ("relatar erros") escolhe quais tipos de mensagem o PHP leva em conta. Cada tipo tem uma constante com o nome dele:
| Constante | Tipo |
|---|---|
E_ALL | Todos (o padrão do PHP 8; é o que você quer enquanto aprende) |
E_WARNING | Os Warning |
E_NOTICE | Os Notice |
E_DEPRECATED | Os Deprecated |
E_ALL & ~E_DEPRECATED | Todos, menos os Deprecated (o ~ quer dizer "menos") |
Você pode mudar as duas configurações dentro do programa, nas primeiras linhas. É comum ver isto no topo de arquivos de quem está desenvolvendo:
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
echo "Olá, $Nome!\n";
- error_reporting(E_ALL);
- "Leve em conta todos os tipos de mensagem."
- ini_set('display_errors', '1');
- Muda uma configuração do
php.inisó para este programa (ini_set= "definir no ini"): "mostre as mensagens".
$ php -d display_errors=0 config.php Warning: Undefined variable $Nome in /home/ana/erros/config.php on line 5 Olá, ! « o ini_set venceu o -d
ini_set não mostra Parse error
Se o arquivo tem um erro de sintaxe, o PHP desiste antes de rodar qualquer linha, inclusive o ini_set. Com display_errors desligado no php.ini, o resultado é a tela vazia:
$ php -d display_errors=0 config2.php $ echo $? 255
Para ver erros de sintaxe, use php -l arquivo.php ou ligue display_errors no php.ini do seu computador.
E não esconda avisos para "consertar" o programa. Desligar os Warning com error_reporting(E_ALL & ~E_WARNING) só tira o bilhete da sua frente; o engano continua lá e o resultado continua errado (Olá, !). Erros são tratados de verdade em Exceções e Depurar.
Os 10 erros mais comuns de quem começa
Cada caso abaixo foi rodado no PHP 8.5. Guarde esta seção: quando aparecer um erro que você não entende, procure aqui pela mensagem. Para a lista completa, veja Mensagens de Erro.
<?php $nome = "Ana" echo "Olá, $nome!\n";
$ php e1.php Parse error: syntax error, unexpected token "echo" in /home/ana/erros/e1.php on line 3
O que significa: "encontrei um echo inesperado na linha 3". Toda instrução do PHP termina com ;. Sem ele, o PHP achou que a linha 2 continuava, e o echo não fazia sentido ali.
Como consertar: coloque o ; no fim da linha de cima (a 2): $nome = "Ana";. Se o ; faltar na última linha do arquivo, a mensagem vira unexpected end of file, expecting "," or ";".
<?php echo "Olá, mundo!\n; echo "Tchau!\n";
$ php e2.php Parse error: syntax error, unexpected identifier "Tchau", expecting "," or ";" in /home/ana/erros/e2.php on line 3
O que significa: a aspa que deveria fechar o texto da linha 2 ficou dentro dele (\n; em vez de \n";). Então o texto continuou até a primeira aspa da linha 3, e o Tchau ficou "solto", fora de qualquer aspas. Repare na dica: o editor do guia e os editores de código pintam o texto entre aspas de outra cor; quando a cor "vaza" para as linhas seguintes, é aspa faltando.
Como consertar: feche as aspas: echo "Olá, mundo!\n";. Se a aspa nunca fecha, a mensagem é unexpected end of file. O mesmo acontece com uma aspa dentro do texto: echo "Ela disse "oi""; dá unexpected identifier "oi"; use 'Ela disse "oi"' ou "Ela disse \"oi\"" (veja Strings).
<?php
$nota = 8;
if ($nota >= 7) {
echo "Aprovada!\n";
echo "Fim\n";
$ php e3.php
Parse error: Unclosed '{' on line 3 in /home/ana/erros/e3.php on line 7
O que significa: "chave { da linha 3 não foi fechada". O PHP chegou ao fim do arquivo (linha 7) ainda esperando a }. Esta mensagem é das boas: diz onde a chave foi aberta.
Como consertar: feche o bloco onde ele deve acabar, com } depois do echo "Aprovada!\n";. Manter o código indentado (com recuo dentro das chaves) ajuda a ver qual chave ficou sem par. O if é assunto de if, elseif, else.
<?php
$nota = 8;
if ($nota >= 7 {
echo "Aprovada!\n";
}
$ php f1.php
Parse error: syntax error, unexpected token "{" in /home/ana/erros/f1.php on line 3
O que significa: o PHP esperava fechar o parêntese da condição e encontrou uma {.
Como consertar: if ($nota >= 7) {. Conte: cada ( precisa de um ). Os editores de código destacam o par quando você põe o cursor num parêntese.
<?php $nome = "Ana"; echo "Olá, $Nome!\n";
$ php e4.php Warning: Undefined variable $Nome in /home/ana/erros/e4.php on line 3 Olá, !
O que significa: "variável não definida: $Nome". No PHP, maiúsculas e minúsculas fazem diferença nos nomes de variáveis: $nome, $Nome e $NOME são três variáveis. O mesmo aviso aparece se você usar a variável antes de criá-la, ou se errar uma letra ($nmoe).
Como consertar: copie o nome exatamente como foi criado: $nome.
$ da variável
<?php $nome = "Ana"; echo nome;
$ php e6.php
Fatal error: Uncaught Error: Undefined constant "nome" in /home/ana/erros/e6.php:3
Stack trace:
#0 {main}
thrown in /home/ana/erros/e6.php on line 3
O que significa: sem $ e sem aspas, uma palavra solta é, para o PHP, o nome de uma constante. Não existe constante chamada nome, e o programa para. Se o $ faltar na criação (nome = "Ana";), o erro é outro, de sintaxe: Parse error: syntax error, unexpected token "=".
Como consertar: echo $nome;. O mesmo erro aparece com a chave de um array sem aspas: $aluna[nome] dá Undefined constant "nome"; o certo é $aluna["nome"].
<?php $texto = "banana"; echo strlenn($texto);
$ php e7.php
Fatal error: Uncaught Error: Call to undefined function strlenn() in /home/ana/erros/e7.php:3
Stack trace:
#0 {main}
thrown in /home/ana/erros/e7.php on line 3
O que significa: "chamada a uma função não definida: strlenn()". A função certa é strlen ("tamanho do texto"), com um n só. O PHP não sugere o nome certo; quem tem que perceber é você.
Como consertar: corrija o nome. Na dúvida, procure a função no manual (php.net/strlen) ou em Funções de String. Se a função é sua, confira se ela foi criada (ou incluída, com require).
<?php $aluna = ["nome" => "Ana", "nota" => 9]; echo $aluna["idade"]; echo "\n"; $frutas = ["maçã", "pera"]; echo $frutas[2];
$ php e8.php Warning: Undefined array key "idade" in /home/ana/erros/e8.php on line 3 Warning: Undefined array key 2 in /home/ana/erros/e8.php on line 6
O que significa: "chave de array não definida". O array $aluna não tem "idade"; o $frutas tem as posições 0 e 1 (a contagem começa no zero), não a 2.
Como consertar: use uma chave que existe, ou confira antes, com isset($aluna["idade"]) ou com o operador ??: echo $aluna["idade"] ?? "sem idade"; (veja Arrays Indexados e ?? e ?->).
+ em vez de .
<?php $nome = "Ana"; echo "Olá, " + $nome;
$ php e10.php
Fatal error: Uncaught TypeError: Unsupported operand types: string + string in /home/ana/erros/e10.php:3
Stack trace:
#0 {main}
thrown in /home/ana/erros/e10.php on line 3
O que significa: "tipos de operando não suportados: texto + texto". Quem vem de JavaScript ou Python escreve + para juntar textos, mas no PHP o + é só para somar números. TypeError é o erro de "tipo errado".
Como consertar: use o ponto, que é o operador de juntar textos: echo "Olá, " . $nome; (veja Operadores de String). Parecido: echo "Frutas: " . $frutas; com um array dá Warning: Array to string conversion e mostra a palavra Array; para ver um array, use print_r (veja var_dump e print_r).
<?php $total = 100; $pessoas = 0; echo $total / $pessoas;
$ php e9.php
Fatal error: Uncaught DivisionByZeroError: Division by zero in /home/ana/erros/e9.php:4
Stack trace:
#0 {main}
thrown in /home/ana/erros/e9.php on line 4
O que significa: "erro de divisão por zero". Dividir por zero não tem resposta na matemática, e o PHP 8 para o programa (no PHP 7 era só um aviso).
Como consertar: confira o divisor antes: if ($pessoas > 0) { echo $total / $pessoas; }. O problema quase nunca é o /: é o valor que chegou zero sem você esperar (um formulário vazio, uma lista sem itens).
echo "Olá, mundo!\n";
$ php f4.php echo "Olá, mundo!\n";
O que significa: não há mensagem de erro, porque o PHP não viu código nenhum. Sem o <?php no começo, tudo é texto comum, e o PHP o devolve como está (veja PHP Dentro do HTML).
Como consertar: comece o arquivo com <?php, na primeira linha, sem nada antes.
Missão: provoque um erro de propósito. Apague o $ do $cidade na linha 3, clique em Rodar e leia a mensagem: qual é a gravidade, o que aconteceu e em que linha?
<?php $cidade = "Recife"; echo $cidade, "\n";
<?php $cidade = "Recife"; echo cidade, "\n";
Roteiro para qualquer erro
Quando uma mensagem aparecer, siga sempre a mesma ordem:
- Leia a primeira palavra.
Parse error? O problema é de escrita (pontuação, aspas, chaves).Fatal error? O código está bem escrito, mas pediu algo impossível.Warning? O programa seguiu com um valor errado. - Leia o "o que aconteceu", traduzindo palavra por palavra. Undefined = não definido; unexpected = inesperado; expecting = esperava; unclosed = não fechado; call to = chamada a.
- Vá até o arquivo e a linha. Num
Parse error, olhe também a linha de cima. - Conserte só o primeiro erro e rode de novo. Um erro no começo pode causar outros mais para baixo; muitas vezes eles somem juntos.
- Ainda não entendeu? Copie a parte fixa da mensagem (sem o seu caminho e o número da linha), como
Undefined array key, e procure em Mensagens de Erro ou num buscador.
Missão final: o programa da lojinha da Ana tem três erros, um de cada tipo desta aula. Rode, leia a mensagem, conserte, rode de novo, até aparecer Produto: Caderno e Total: R$ 37.5 sem nenhuma mensagem do PHP. Repare que cada conserto revela o erro seguinte.
<?php $produto = "Caderno"; $preco = 12.5; $qtd = 3 $total = $preco * $qtd; echo "Produto: " . $Produto . "\n"; echo "Total: R$ " + $total . "\n";
<?php $produto = "Caderno"; $preco = 12.5; $qtd = 3; $total = $preco * $qtd; echo "Produto: " . $produto . "\n"; echo "Total: R$ " . $total . "\n";
No PHP real, a sequência de mensagens foi esta. Primeiro, o Parse error (o ; que falta na linha 4 só é notado na linha 6, por causa da linha em branco):
$ php loja.php Parse error: syntax error, unexpected variable "$total" in /home/ana/erros/loja.php on line 6
Depois de colocar o ;, o programa roda até a linha 8:
$ php loja.php
Warning: Undefined variable $Produto in /home/ana/erros/loja.php on line 7
Produto:
Fatal error: Uncaught TypeError: Unsupported operand types: string + float in /home/ana/erros/loja.php:8
Stack trace:
#0 {main}
thrown in /home/ana/erros/loja.php on line 8
Com $produto minúsculo e o . no lugar do +:
$ php loja.php Produto: Caderno Total: R$ 37.5
Referência
| Mensagem (parte fixa) | Tradução | Causa mais comum |
|---|---|---|
Parse error: syntax error, unexpected … | erro de sintaxe, … inesperado | Falta ;, aspas, ) ou } na linha indicada ou na de cima |
… expecting "," or ";" | esperava , ou ; | Falta o ; na instrução anterior |
unexpected end of file | fim do arquivo inesperado | Algo aberto e nunca fechado (aspas, parênteses) |
Unclosed '{' on line N | chave aberta na linha N não fechada | Falta uma } |
Warning: Undefined variable $x | variável não definida | Nome diferente (maiúscula, letra trocada) ou usada antes de criar |
Warning: Undefined array key | chave de array não definida | Chave que não existe; posição além do fim |
Warning: Array to string conversion | conversão de array em texto | echo de um array inteiro |
Error: Undefined constant "x" | constante não definida | Faltou o $ ou as aspas |
Error: Call to undefined function f() | função não definida | Nome errado ou arquivo da função não incluído |
TypeError: Unsupported operand types | tipos de operando não suportados | + com textos (use .) |
DivisionByZeroError: Division by zero | divisão por zero | Divisor que chegou zero |
ArgumentCountError: f() expects exactly 1 argument, 0 given | esperava 1 argumento, recebeu 0 | Faltou passar algo para a função |
Deprecated: … | obsoleto | Código antigo; a mensagem diz o substituto |
| Ferramenta | O que faz |
|---|---|
php -l arquivo.php | Confere a sintaxe sem rodar |
php -d display_errors=0 arquivo.php | Roda uma vez com uma configuração diferente |
php --ini / php -i | Mostra qual php.ini é usado / os valores atuais |
error_reporting(E_ALL); | Dentro do programa: levar em conta todos os tipos |
ini_set('display_errors', '1'); | Dentro do programa: mostrar as mensagens (não vale para Parse error) |
echo $? | No terminal, logo depois: 255 = terminou com erro fatal ou de sintaxe |
Exercícios
1. Traduza a gravidade
Qual palavra começa a mensagem de um erro que impede o PHP de rodar qualquer linha do arquivo?
2. Conferir sem rodar
Complete o comando que confere a sintaxe de loja.php sem executá-lo:
3. Qual linha?
O PHP mostrou Parse error: syntax error, unexpected token "echo", expecting "," or ";" in /home/ana/site/index.php on line 12, e a linha 12 começa com echo e parece certa. Em qual linha está, provavelmente, o ; que falta (supondo que não há linhas em branco)?
4. O programa mostrou Warning: Undefined variable $total na linha 4. O que aconteceu com as linhas 5, 6 e 7?
5. Qual destas mensagens aparece quando você esquece o $ em echo nome;?
6. O site da Ana, no ar, mostra uma página em branco. Por que a mensagem de erro não aparece no navegador?
7. O que acontece com echo "Total: " + 10;?
Resumo
- Toda mensagem do PHP tem quatro partes: gravidade, o que aconteceu, arquivo (in) e linha (on line).
Parse error: o código está mal escrito; nenhuma linha roda.Fatal error: o programa para naquela linha.Warning,DeprecatedeNotice: o programa continua, possivelmente com valores errados.- Num
Parse error, o problema costuma estar na linha indicada ou antes;end of file= algo ficou aberto. php -lconfere a sintaxe sem rodar.echo $?igual a255= terminou com erro.display_errorsmostra ou esconde as mensagens;error_reportingescolhe os tipos. Ligados no seu computador,display_errorsdesligado no site no ar (os erros vão para o log).- No navegador, a mensagem vem em HTML (
<b>Warning</b>); comdisplay_errorsdesligado, um erro fatal vira tela branca e500. - Conserte o primeiro erro e rode de novo. Nunca esconda avisos: conserte a causa.