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.

Você vai aprender
  • 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, Deprecated e Notice, 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_errors e error_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 é o echo.

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 comTraduçãoO programa…Quando acontece
Parse errorerro de análise (de escrita)nem começa: nenhuma linha rodaO código está escrito de um jeito que o PHP não entende: falta ;, aspas, chaves…
Fatal errorerro fatalpara naquela linha; o que vinha antes já rodouO código está bem escrito, mas pede algo impossível: uma função que não existe, dividir por zero…
WarningavisocontinuaAlgo provavelmente errado: variável que não existe, posição de array que não existe.
DeprecatedobsoletocontinuaFunciona hoje, mas vai deixar de funcionar numa versão futura do PHP.
NoticeobservaçãocontinuaUm 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 echo que 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 fileo 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:

  1. Vá até a linha indicada.
  2. Se ela parece certa, suba: olhe a última linha com código antes dela.
  3. 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.
Ligue os números de linha no editor

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

Ondedisplay_errorsPor quê
Seu computador (desenvolvimento)ligadoVocê quer ver cada erro na hora, para consertar.
Site no ar (produção)desligado, com log_errors ligadoA 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.

Por que às vezes a mensagem aparece duas vezes?

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:

ConstanteTipo
E_ALLTodos (o padrão do PHP 8; é o que você quer enquanto aprende)
E_WARNINGOs Warning
E_NOTICEOs Notice
E_DEPRECATEDOs Deprecated
E_ALL & ~E_DEPRECATEDTodos, 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.ini só 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
O 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.

1. Esqueceu o ponto e vírgula
<?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 ";".

2. Aspas abertas e não fechadas
<?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).

3. Chave aberta e não fechada
<?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.

4. Parêntese faltando
<?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.

5. Variável com nome diferente (maiúscula, erro de digitação)
<?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.

6. Esqueceu o $ 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"].

7. Nome de função errado
<?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).

8. Posição de array que não existe
<?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 ?->).

9. Juntar textos com + 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).

10. Divisão por zero
<?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).

Bônus: o código apareceu na tela, em vez de rodar
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:

  1. 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.
  2. 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.
  3. Vá até o arquivo e a linha. Num Parse error, olhe também a linha de cima.
  4. 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.
  5. 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çãoCausa mais comum
Parse error: syntax error, unexpected …erro de sintaxe, … inesperadoFalta ;, aspas, ) ou } na linha indicada ou na de cima
… expecting "," or ";"esperava , ou ;Falta o ; na instrução anterior
unexpected end of filefim do arquivo inesperadoAlgo aberto e nunca fechado (aspas, parênteses)
Unclosed '{' on line Nchave aberta na linha N não fechadaFalta uma }
Warning: Undefined variable $xvariável não definidaNome diferente (maiúscula, letra trocada) ou usada antes de criar
Warning: Undefined array keychave de array não definidaChave que não existe; posição além do fim
Warning: Array to string conversionconversão de array em textoecho de um array inteiro
Error: Undefined constant "x"constante não definidaFaltou o $ ou as aspas
Error: Call to undefined function f()função não definidaNome errado ou arquivo da função não incluído
TypeError: Unsupported operand typestipos de operando não suportados+ com textos (use .)
DivisionByZeroError: Division by zerodivisão por zeroDivisor que chegou zero
ArgumentCountError: f() expects exactly 1 argument, 0 givenesperava 1 argumento, recebeu 0Faltou passar algo para a função
Deprecated: …obsoletoCódigo antigo; a mensagem diz o substituto
FerramentaO que faz
php -l arquivo.phpConfere a sintaxe sem rodar
php -d display_errors=0 arquivo.phpRoda uma vez com uma configuração diferente
php --ini / php -iMostra 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:

php

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)?

linha

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, Deprecated e Notice: 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 -l confere a sintaxe sem rodar. echo $? igual a 255 = terminou com erro.
  • display_errors mostra ou esconde as mensagens; error_reporting escolhe os tipos. Ligados no seu computador, display_errors desligado no site no ar (os erros vão para o log).
  • No navegador, a mensagem vem em HTML (<b>Warning</b>); com display_errors desligado, um erro fatal vira tela branca e 500.
  • Conserte o primeiro erro e rode de novo. Nunca esconda avisos: conserte a causa.