PHP Mensagens de Erro

Quando algo dá errado, o PHP escreve uma mensagem em inglês com o tipo do problema, o texto, o arquivo e a linha. Esta página junta as mensagens que você mais vai encontrar, cada uma com o código que a provoca, o que ela quer dizer, como consertar e a aula onde o assunto é explicado. Todas foram provocadas de verdade no PHP 8.5, na máquina da Ana. Para aprender a ler erros com calma, veja Lendo Erros do PHP e Tipos de Erro.

Como usar esta página
  • Copie o começo da mensagem que apareceu para você (por exemplo, Undefined array key) e procure aqui com Ctrl+F.
  • As mensagens foram geradas por arquivos pequenos na pasta ~/erros da Ana (e08.php, f05.php…). No seu computador, o caminho e o número da linha serão outros; o texto é o mesmo.
  • Nas tabelas aparece só a primeira linha de cada erro. Os erros "Uncaught" também trazem um Stack trace, explicado logo abaixo.

Atalhos: Ler uma mensagem · Os níveis · Terminal × navegador · Parse error · Variáveis e arrays · Tipos e contas · Funções · Classes e objetos · Arquivos, include e cabeçalhos · Banco de dados · JSON, datas e valores · Limites · Deprecated


Como ler uma mensagem

Um exemplo completo. A Ana chamou uma função com um texto onde ela esperava um número:

<?php
function dobro(int $n): int {
    return $n * 2;
}
echo dobro("quatro");
$ php e17.php

Fatal error: Uncaught TypeError: dobro(): Argument #1 ($n) must be of type int, string given, called in /home/ana/erros/e17.php on line 5 and defined in /home/ana/erros/e17.php:2
Stack trace:
#0 /home/ana/erros/e17.php(5): dobro('quatro')
#1 {main}
  thrown in /home/ana/erros/e17.php on line 2
PedaçoO que quer dizer
Fatal errorO nível: fatal = o programa parou aqui. Veja os níveis.
Uncaught TypeError"TypeError não capturado": o PHP lançou uma exceção do tipo TypeError e ninguém a tratou com try/catch. Veja Exceções.
dobro(): Argument #1 ($n) must be of type int, string givenO texto do problema: "o argumento nº 1 ($n) de dobro() precisa ser do tipo int; foi dado um string".
called in … on line 5Onde a função foi chamada (a linha que você precisa consertar).
defined in …:2Onde a função foi criada.
Stack trace:"Rastro da pilha": o caminho até o erro, do mais recente (#0) ao começo do programa ({main}, o corpo do arquivo). #0 …e17.php(5): dobro('quatro') = "na linha 5, chamou dobro com 'quatro'".
thrown in … on line 2Onde a exceção foi lançada.
Regra de ouro

Leia a primeira mensagem primeiro. Um erro costuma causar outros logo depois (um arquivo que não abriu vira um false, que estoura na linha seguinte). Conserte o primeiro e rode de novo.

Os níveis de erro

Nível (como aparece)O programa…Código de saída no terminalQuando aparece
Parse errornem começa: o PHP não conseguiu entender o arquivo255erro de digitação na sintaxe (falta ;, }, aspas)
Fatal errorpara na hora255exceção não tratada (Uncaught …) ou erro grave (classe declarada duas vezes, memória esgotada)
Warning (aviso)continua, mas com um valor errado (normalmente null)0algo provavelmente errado: variável ou chave que não existe, arquivo que não abriu
Notice (nota)continua0algo estranho, mas que funcionou
Deprecated (obsoleto)continua normalmente0o código usa algo que vai deixar de funcionar numa versão futura do PHP

Avisos não param o programa, mas não os ignore: quase sempre são um defeito de verdade. Neste exemplo, o aviso da linha 3 deixou a aluna sem nome, o da linha 4 escreveu "Array", e só a divisão por zero, na linha 6, parou tudo:

$ php missao.php

Warning: Undefined array key "Nome" in /home/ana/erros/missao.php on line 3
Aluna:

Warning: Array to string conversion in /home/ana/erros/missao.php on line 4
Notas: Array

Fatal error: Uncaught DivisionByZeroError: Division by zero in /home/ana/erros/missao.php:6
Stack trace:
#0 {main}
  thrown in /home/ana/erros/missao.php on line 6
$ echo $?
255

(Você vai consertar esse programa na missão do fim da página.)

No terminal × no navegador

A mesma mensagem aparece de jeitos diferentes conforme o lugar e a configuração (php.ini):

OndeComo aparece
Terminal (php arquivo.php)Warning: … na saída normal, com uma linha em branco antes. Se o php.ini tiver log_errors=On (comum no PHP das distribuições Linux), aparece também PHP Warning: … na saída de erro.
Navegador (php -S, Apache…)Em HTML: <b>Warning</b> em negrito, no meio da página, se display_errors estiver ligado (desenvolvimento).
Log do servidorO php -S escreve os erros fatais no terminal onde ele está rodando, junto com cada requisição.
Produção (site no ar)display_errors=Off: o visitante não vê nada (só uma página em branco ou um erro 500); a mensagem vai para o arquivo de log. Veja Depurar.

Com log_errors ligado, a mensagem sai duas vezes. A primeira (PHP Warning: …, com dois espaços) é o log, na saída de erro; a segunda é a exibição:

$ php -d log_errors=1 e08.php
PHP Warning:  Undefined variable $nome in /home/ana/erros/e08.php on line 2

Warning: Undefined variable $nome in /home/ana/erros/e08.php on line 2
$ php -d log_errors=1 e08.php 2>/dev/null

Warning: Undefined variable $nome in /home/ana/erros/e08.php on line 2

No navegador, a página aviso.php (que usa $_GET["nome"] sem conferir e chama uma função que não existe) chega assim. O curl -si mostra a resposta crua, com os cabeçalhos:

<?php
echo "<p>Olá, " . $_GET["nome"] . "</p>";
echo dobro(2);
$ curl -si localhost:8000/aviso.php
HTTP/1.1 200 OK
Host: localhost:8000
Date: Fri, 16 Oct 2026 23:45:59 GMT
Connection: close
X-Powered-By: PHP/8.5.8
Content-type: text/html; charset=UTF-8

<br />
<b>Warning</b>:  Undefined array key "nome" in <b>/home/ana/web/aviso.php</b> on line <b>2</b><br />
<p>Olá, </p><br />
<b>Fatal error</b>:  Uncaught Error: Call to undefined function dobro() in /home/ana/web/aviso.php:3
Stack trace:
#0 {main}
  thrown in <b>/home/ana/web/aviso.php</b> on line <b>3</b><br />

E, no terminal onde o servidor roda:

$ php -S localhost:8000
[Fri Oct 16 20:45:59 2026] PHP 8.5.8 Development Server (http://localhost:8000) started
[Fri Oct 16 20:45:59 2026] 127.0.0.1:57888 Accepted
[Fri Oct 16 20:45:59 2026] 127.0.0.1:57888 [200]: GET /aviso.php - Uncaught Error: Call to undefined function dobro() in /home/ana/web/aviso.php:3
Stack trace:
#0 {main}
  thrown in /home/ana/web/aviso.php on line 3
[Fri Oct 16 20:45:59 2026] 127.0.0.1:57888 Closing
Só conferir a sintaxe: php -l

php -l arquivo.php ("lint") procura erros de sintaxe sem rodar o programa:

$ php -l e01.php

Parse error: syntax error, unexpected token "echo" in e01.php on line 3
Errors parsing e01.php
$ php -l e08.php
No syntax errors detected in e08.php

Parse error (sintaxe)

O PHP lê o arquivo inteiro antes de rodar. Se a "gramática" estiver errada, nada é executado. A linha apontada é onde o PHP percebeu o problema, que muitas vezes está na linha anterior. Aula: Sintaxe.

Mensagem realCódigo que provocaCausa e correçãoAula
Parse error: syntax error, unexpected token "echo" in /home/ana/erros/e01.php on line 3$nome = "Ana"
echo "Olá, $nome!";
Faltou o ; no fim da linha 2. "unexpected token" = "palavra inesperada": o PHP achou o echo no meio da atribuição. Ponha o ; na linha anterior à apontada.Sintaxe
Parse error: syntax error, unexpected variable "$total" in /home/ana/erros/e05.php on line 3$preco = 10
$total = $preco * 2;
Mesma causa: falta ; na linha anterior; aqui o que veio depois foi uma variável.Sintaxe
Parse error: syntax error, unexpected variable "$total", expecting "," or ";" in /home/ana/erros/e06.php on line 2echo "Total: " $total;Faltou o operador entre o texto e a variável. "expecting" = "esperava". Use o ponto: "Total: " . $total.Operadores de String
Parse error: syntax error, unexpected token "}", expecting ";" in /home/ana/erros/e07.php on line 4return $a + $b
}
Faltou ; antes da chave que fecha o bloco.Funções
Parse error: syntax error, unexpected end of file, expecting "," or ";" in /home/ana/erros/f32.php on line 4echo $x++ + ++$x (última linha, sem ;)"end of file" = fim do arquivo. Faltou o ; na última instrução. (Exceção: logo antes de ?> o ; é opcional.)Sintaxe
Parse error: Unclosed '{' on line 2 in /home/ana/erros/e02.php on line 4if (true) {
echo "oi";
Uma { aberta na linha 2 nunca foi fechada. Conte as chaves; um editor com destaque de pares ajuda (Editores).if, elseif, else
Parse error: Unmatched '}' in /home/ana/erros/e04.php on line 3echo "oi";
}
Uma } sobrando, sem { correspondente. Apague-a ou ache a { que falta.Sintaxe
Parse error: syntax error, unexpected end of file, expecting variable or "${" or "{$" in /home/ana/erros/e03.php on line 3echo "Olá, mundo!;Aspas abertas e não fechadas: o PHP leu até o fim do arquivo procurando o " final. Feche as aspas: "Olá, mundo!";.Strings
Parse error: syntax error, unexpected token "{", expecting "," or ";" in /home/ana/erros/f34.php on line 3echo $lista{0};Chaves para ler posição de array/string eram aceitas em PHP antigo e foram removidas no 8.0. Use colchetes: $lista[0].Arrays

Variáveis e arrays

Mensagem realCódigo que provocaCausa e correçãoAula
Warning: Undefined variable $nome in /home/ana/erros/e08.php on line 2echo $nome;A variável não recebeu valor antes desta linha: nome digitado diferente ($Nome, $name), criada mais abaixo ou dentro de um if que não rodou. O valor usado é null.Variáveis
Warning: Undefined array key "idade" in /home/ana/erros/e09.php on line 3$aluno = ["nome" => "Ana"];
echo $aluno["idade"];
A chave não existe no array (ou foi escrita diferente: "Nome" ≠ "nome"). Muito comum com $_GET/$_POST quando o campo não veio. Use $aluno["idade"] ?? "?" ou isset.Arrays Associativos, ??
Warning: Undefined array key 5 in /home/ana/erros/e09.php on line 5$frutas = ["maçã", "banana"];
echo $frutas[5];
Posição que não existe. Os índices vão de 0 a count($frutas) - 1.Arrays
Warning: Trying to access array offset on null in /home/ana/erros/e10.php on line 3$x = null;
echo $x["nome"];
Você tratou como array algo que é null (uma busca que não achou nada, um fetch() sem resultado). Confira antes: if ($x !== null), ou use $x["nome"] ?? "".null
Warning: Attempt to read property "nome" on null in /home/ana/erros/e10.php on line 4$x = null;
echo $x->nome;
O mesmo, com objeto: $x é null. Use o nullsafe: $x?->nome.?? e ?->
Warning: Undefined global variable $contador in /home/ana/erros/f27.php on line 2echo $GLOBALS["contador"];Não existe variável global com esse nome. Veja como funcionam as variáveis globais.Escopo
Warning: Array to string conversion in /home/ana/erros/e11.php on line 3echo "Frutas: " . $frutas;Tentou escrever um array inteiro como texto; sai a palavra Array. Use implode(", ", $frutas), um foreach ou print_r.var_dump e print_r, Funções de Array
Warning: foreach() argument must be of type array|object, null given in /home/ana/erros/e12.php on line 3$itens = null;
foreach ($itens as $i) …
O foreach só percorre arrays e objetos. Garanta um array: foreach ($itens ?? [] as $i).foreach
Warning: Uninitialized string offset 10 in /home/ana/erros/e41.php on line 3$s = "Ana";
echo $s[10];
Posição além do fim do texto. Confira com strlen (ou mb_strlen).Strings
Fatal error: Uncaught TypeError: Cannot access offset of type string on string in /home/ana/erros/f28.php:3$a = "Ana";
echo $a["x"];
A variável é um texto, não um array; num texto só dá para pedir posições numéricas. Confira o tipo com var_dump.var_dump
Fatal error: Uncaught Error: Cannot use a scalar value as an array in /home/ana/erros/e55.php:3$total = 10;
$total[] = 5;
Tentou acrescentar item ([]) numa variável que tem um número. Use outra variável ou comece com $total = [];.Arrays
Fatal error: Cannot use [] for reading in /home/ana/erros/e57.php on line 3$f = $frutas[];[] vazio serve só para acrescentar ($frutas[] = "uva";). Para ler, diga a posição: $frutas[0].Arrays
Fatal error: Uncaught Error: Undefined constant "PRECO" in /home/ana/erros/e21.php:2echo PRECO;Constante não definida (ou você esqueceu o $ de uma variável: PRECO × $preco).Constantes
Warning: Constant PI already defined, this will be an error in PHP 9 in /home/ana/erros/e44.php on line 3define("PI", 3.14);
define("PI", 3.1416);
Constantes não mudam de valor. O segundo define é ignorado. Use outro nome ou uma variável.Constantes

Experimente (provoque o erro): o programa funciona. Troque $nome por $name só no echo, rode e leia o aviso: qual variável ele diz que não existe? Em que linha?

<?php
$nome = "Ana";
echo "Olá, $nome!\n";
<?php
$nome = "Ana";
echo "Olá, $name!\n";

Tipos e contas

Mensagem realCódigo que provocaCausa e correçãoAula
Fatal error: Uncaught DivisionByZeroError: Division by zero in /home/ana/erros/e14.php:2echo 10 / 0;
intdiv(10, 0)
Divisão por zero (no PHP 8 é um erro, não um aviso). Confira o divisor antes: if ($qtd > 0).Operadores Aritméticos
Fatal error: Uncaught DivisionByZeroError: Modulo by zero in /home/ana/erros/e15.php:2echo 10 % 0;Resto da divisão (%) por zero. Mesma correção.Operadores Aritméticos
Warning: A non-numeric value encountered in /home/ana/erros/e13.php on line 2echo "5 maçãs" + 1; (mostra 6)
"10" + "5,5"
O texto começa com número mas tem lixo depois. O PHP usa só o começo ("5,5" vira 5: a vírgula não é decimal!). Limpe o valor antes ou valide com is_numeric/filter_var.Conversão de Tipos, Validar Dados
Fatal error: Uncaught TypeError: Unsupported operand types: string + int in /home/ana/erros/e13.php:4echo "abc" + 1;
"R$ 10" * 2 (string * int)
Conta com um texto que não é número nenhum. Converta e valide antes ((float) str_replace(",", ".", $valor)).Conversão de Tipos
Fatal error: Uncaught TypeError: Unsupported operand types: array + int in /home/ana/erros/e56.php:2$x = [1, 2] + 5;Conta com um array. Para somar os itens: array_sum([1, 2]) + 5.Funções de Array
Fatal error: Uncaught TypeError: Cannot assign string to property Aluno::$idade of type int in /home/ana/erros/e33.php:4public int $idade;
$a->idade = "vinte";
Propriedade com tipo int recebeu um texto. Converta ((int) $valor) depois de validar.Propriedades e Métodos
Fatal error: Uncaught Error: Object of class Produto could not be converted to string in /home/ana/erros/e31.php:4echo $p; (um objeto)Um objeto não vira texto sozinho. Escreva uma propriedade ($p->nome) ou crie o método __toString().Métodos Mágicos
Fatal error: Uncaught UnhandledMatchError: Unhandled match case 7 in /home/ana/erros/e26.php:3match ($nota) { 10 => …, 5 => … } com $nota = 7Nenhum braço do match casou com o valor. Acrescente o braço que falta ou um default => ….match

Funções

Mensagem realCódigo que provocaCausa e correçãoAula
Fatal error: Uncaught Error: Call to undefined function dobro() in /home/ana/erros/e16.php:2echo dobro(4);A função não existe: nome errado, ou ela está em outro arquivo que não foi incluído (require). Funções de extensões também caem aqui se a extensão não estiver instalada (mb_strlen sem mbstring).Funções, include e require
Fatal error: Uncaught ArgumentCountError: Too few arguments to function soma(), 1 passed in /home/ana/erros/e18.php on line 5 and exactly 2 expected in /home/ana/erros/e18.php:2function soma($a, $b)
soma(1);
Faltou argumento: a função pede 2, você passou 1. Passe todos ou dê um valor padrão ao parâmetro ($b = 0).Parâmetros
Fatal error: Uncaught TypeError: dobro(): Argument #1 ($n) must be of type int, string given, called in … on line 5 …function dobro(int $n)
dobro("quatro");
O argumento não é do tipo declarado. Passe o tipo certo (converta antes, se o valor veio de formulário).Tipos e Retorno
Fatal error: Uncaught TypeError: idade(): Return value must be of type int, string returned in /home/ana/erros/f07.php:3function idade(): int {
return "vinte";
A função prometeu devolver int e devolveu outra coisa. Corrija o return ou o tipo.Tipos e Retorno
Fatal error: Uncaught Error: Unknown named parameter $nme in /home/ana/erros/e48.php:3saudar(nme: "Ana");Argumento nomeado com nome que a função não tem (erro de digitação). O nome é o do parâmetro, sem o $: saudar(nome: "Ana").Parâmetros
Fatal error: Cannot redeclare function f() (previously declared in /home/ana/erros/e32.php:2) in /home/ana/erros/e32.php on line 3duas function f(); ou include do mesmo arquivo duas vezesDois arquivos (ou o mesmo, incluído duas vezes) criam a mesma função. Use require_once ou renomeie.include e require
Fatal error: Uncaught Error: aumentar(): Argument #1 ($lista) could not be passed by reference in /home/ana/erros/f20.php:3function aumentar(array &$lista)
aumentar([1, 2]);
O parâmetro com & precisa de uma variável (que será alterada), não de um valor solto. Guarde em $lista e passe $lista.Parâmetros
Notice: Only variables should be passed by reference in /home/ana/erros/e50.php on line 3echo end(explode(",", "a,b,c"));Mesma ideia, mais branda: end quer uma variável. Guarde antes: $partes = explode(…); echo end($partes); (ou array_last, no 8.5).Funções de Array
Fatal error: Uncaught Error: Value of type int is not callable in /home/ana/erros/f26.php:3$x = 10;
$x();
Parênteses depois de uma variável que não guarda uma função.Funções Anônimas
Fatal error: Uncaught TypeError: array_map(): Argument #1 ($callback) must be a valid callback or null, function "dobrar" not found or invalid function name in /home/ana/erros/f14.php:2array_map("dobrar", [1, 2, 3]);O nome da função passada como texto não existe. Confira o nome ou passe uma função anônima: fn($n) => $n * 2.Callables
Fatal error: Only the last parameter can be variadic in /home/ana/erros/f35.php on line 2function f(int ...$n, $x)O parâmetro com ... tem de ser o último.Funções Variádicas
Warning: The return value of function calcular() should either be used or intentionally ignored by casting it as (void) in /home/ana/erros/e52.php on line 4 PHP 8.5+#[\NoDiscard]
function calcular(): int
calcular();
A função foi marcada com #[\NoDiscard] ("não descarte") e você ignorou o resultado. Use-o ($r = calcular();) ou descarte de propósito: (void) calcular();.Atributos

Classes e objetos

Mensagem realCódigo que provocaCausa e correçãoAula
Fatal error: Uncaught Error: Class "Produto" not found in /home/ana/erros/e19.php:2$p = new Produto();A classe não foi carregada: falta o require, o autoload não achou o arquivo, o nome está diferente ou falta o use do namespace.Classes e Objetos, Autoload, Namespaces
Fatal error: Uncaught Error: Call to a member function depositar() on null in /home/ana/erros/e20.php:3$conta = null;
$conta->depositar(50);
Chamou um método numa variável que não tem objeto (null): a busca não achou nada, ou faltou o new. Confira antes, ou use $conta?->depositar(50).?? e ?->
Fatal error: Uncaught Error: Call to a member function formatar() on string in /home/ana/erros/e59.php:3$valor = "10";
$valor->formatar();
Textos, números e arrays não têm métodos no PHP: use funções (strtoupper($valor)).Funções de String
Fatal error: Uncaught Error: Call to undefined method Conta::sacar() in /home/ana/erros/f03.php:4$c->sacar(10);A classe não tem esse método (nome errado ou ainda não criado).Propriedades e Métodos
Warning: Undefined property: Conta::$titular in /home/ana/erros/f04.php on line 4echo $c->titular;Leu uma propriedade que a classe não tem.Propriedades e Métodos
Deprecated: Creation of dynamic property Aluno::$idade is deprecated in /home/ana/erros/e28.php on line 6 PHP 8.2+$a->idade = 20; (a classe não declara $idade)Criar propriedade "na hora", fora da classe. Declare-a na classe: public int $idade;.Propriedades e Métodos
Fatal error: Uncaught Error: Attempt to assign property "saldo" on null in /home/ana/erros/f12.php:3$conta = null;
$conta->saldo = 10;
Atribuiu propriedade a algo que não é objeto. Crie o objeto antes (new).Classes e Objetos
Fatal error: Uncaught Error: Typed property Aluno::$idade must not be accessed before initialization in /home/ana/erros/e34.php:4public int $idade;
echo $a->idade;
Propriedade com tipo ainda sem valor. Dê um valor no construtor ou um padrão (public int $idade = 0;).Construtores
Fatal error: Uncaught Error: Cannot access private property Conta::$saldo in /home/ana/erros/e27.php:6echo $c->saldo; (private)Propriedade privada só é usada dentro da classe. Crie um método público (getSaldo()).Visibilidade
Fatal error: Uncaught Error: Call to private method Conta::auditar() from global scope in /home/ana/erros/f02.php:6$c->auditar(); (private)O mesmo, com método. "from global scope" = chamado de fora de qualquer classe.Visibilidade
Fatal error: Uncaught Error: Cannot modify readonly property Ponto::$x in /home/ana/erros/e29.php:6$p->x = 2; (readonly)Propriedade readonly só recebe valor uma vez. Crie um objeto novo (ou use clone with, 8.5).readonly e Property Hooks
Fatal error: Uncaught Error: Non-static method Calc::somar() cannot be called statically in /home/ana/erros/f08.php:5Calc::somar(1, 2);:: só chama métodos static. Crie um objeto ((new Calc)->somar(1, 2)) ou declare o método static.static
Fatal error: Uncaught Error: Using $this when not in object context in /home/ana/erros/f09.php:3$this dentro de uma função comum (ou método static)$this só existe dentro de métodos de um objeto.Propriedades e Métodos
Fatal error: Uncaught Error: Cannot instantiate abstract class Forma in /home/ana/erros/e30.php:3new Forma() (abstrata)Classe abstrata é só modelo. Crie um objeto de uma classe filha.Classes Abstratas
Fatal error: Uncaught Error: Cannot instantiate interface Forma in /home/ana/erros/f01.php:3new Forma() (interface)Interface não vira objeto. Use uma classe que a implementa.Interfaces
Fatal error: Class Quadrado contains 1 abstract method and must therefore be declared abstract or implement the remaining method (Forma::area) in /home/ana/erros/e49.php on line 3class Quadrado implements Forma {}A classe prometeu (implements/extends) um método e não o escreveu. Implemente area().Interfaces
Fatal error: Declaration of B::f(string $x) must be compatible with A::f(int $x) in /home/ana/erros/e58.php on line 3a filha reescreve f com outro tipo de parâmetroAo sobrescrever, mantenha parâmetros e retorno compatíveis com os da classe mãe.Herança
Fatal error: Cannot override final method A::f() in /home/ana/erros/f36.php on line 3a filha reescreve um método finalfinal = "não pode ser sobrescrito". Use outro nome.Herança
Fatal error: Cannot redeclare class Aluno (previously declared in /home/ana/erros/f11.php:2) in /home/ana/erros/f11.php on line 3duas class Aluno (ou arquivo incluído duas vezes)Use require_once/autoload, ou namespaces para nomes iguais.Autoload
Fatal error: Uncaught Error: Undefined constant Status::Inativo in /home/ana/erros/f15.php:3Status::Inativo (o enum só tem Ativo)Caso de enum (ou constante de classe) que não existe.Enums

Arquivos, include, cabeçalhos e sessão

Mensagem realCódigo que provocaCausa e correçãoAula
Warning: include(config.php): Failed to open stream: No such file or directory in /home/ana/erros/e23.php on line 2
Warning: include(): Failed opening 'config.php' for inclusion (include_path='.:') in /home/ana/erros/e23.php on line 2
include "config.php"; (arquivo não existe)O arquivo não foi achado; com include o programa continua (sem as funções/variáveis dele). Caminhos relativos dependem da pasta de onde você rodou: prefira include __DIR__ . "/config.php";.include e require
Warning: require(config.php): Failed to open stream: No such file or directory in /home/ana/erros/e22.php on line 2
Fatal error: Uncaught Error: Failed opening required 'config.php' (include_path='.:') in /home/ana/erros/e22.php:2
require "config.php";O mesmo com require: aqui o programa para. Mesma correção.include e require
Warning: file_get_contents(notas.txt): Failed to open stream: No such file or directory in /home/ana/erros/e25.php on line 2file_get_contents("notas.txt")Arquivo inexistente; a função devolve false. Confira com file_exists antes, e use __DIR__.Ler e Escrever Arquivos
Warning: fopen(nao-existe/notas.txt): Failed to open stream: No such file or directory …
Fatal error: Uncaught TypeError: fwrite(): Argument #1 ($stream) must be of type resource, false given in /home/ana/erros/f37.php:3
$arquivo = fopen("nao-existe/notas.txt", "w");
fwrite($arquivo, "oi");
Um erro puxando outro: a pasta não existe, o fopen devolveu false, e o fwrite recebeu esse false. Conserte o primeiro e confira: if ($arquivo === false). Se o texto for Permission denied, é permissão da pasta.Ler e Escrever Arquivos
Warning: Cannot modify header information - headers already sent by (output started at /home/ana/erros/e24.php:2) in /home/ana/erros/e24.php on line 3echo "Olá";
header("Location: /outra.php"); (ou setcookie)
Cabeçalhos HTTP têm de sair antes de qualquer conteúdo. A mensagem diz onde a saída começou (e24.php:2): um echo, HTML, ou até um espaço/linha em branco antes do <?php. Mova o header/setcookie para antes.header e Redirecionamento, Cookies
Warning: session_start(): Session cannot be started after headers have already been sent (sent from /home/ana/erros/f18.php on line 2) in /home/ana/erros/f18.php on line 3echo "Olá";
session_start();
O mesmo para a sessão: session_start() vai no topo, antes de qualquer saída.Sessões
Notice: session_start(): Ignoring session_start() because a session is already active (started from /home/ana/erros/e51.php on line 2) in /home/ana/erros/e51.php on line 3dois session_start() (comum quando um include também chama)Chame uma vez só, num arquivo comum (ou if (session_status() === PHP_SESSION_NONE)).Sessões
Fatal error: Uncaught TypeError: htmlspecialchars(): Argument #1 ($string) must be of type string, array given in /home/ana/erros/f06.php:3htmlspecialchars($_GET["busca"]) com ?busca[]=aO visitante pode mandar um array no lugar de um texto (busca[]=). Confira com is_string antes de usar.Escapar a Saída, Validar Dados

Banco de dados (PDO)

Desde o PHP 8.0 o PDO lança PDOException em todo erro. O texto depois de SQLSTATE[…] vem do próprio banco (aqui, SQLite). Aula: Conectar com PDO.

Mensagem realCódigo que provocaCausa e correçãoAula
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1 no such table: posts in /home/ana/erros/e46.php:3$pdo->query("SELECT * FROM posts");A tabela não existe: falta o CREATE TABLE, o nome está errado, ou o PHP abriu outro arquivo de banco (caminho relativo; use __DIR__).Banco de Dados
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1 near "SELEC": syntax error in /home/ana/erros/f25.php:3$pdo->query("SELEC * FROM t");Erro de digitação no SQL, perto da palavra indicada.CRUD com PDO
Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 19 UNIQUE constraint failed: t.nome in /home/ana/erros/f22.php:6inserir duas vezes o mesmo valor numa coluna UNIQUEO banco recusou um valor repetido (ou vazio numa coluna NOT NULL: NOT NULL constraint failed). Trate com try/catch e mostre uma mensagem amigável.CRUD com PDO
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1 2 values for 1 columns in /home/ana/erros/f23.php:4INSERT INTO t (nome) VALUES (?, ?)Número de colunas diferente do número de valores.Prepared Statements
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 25 column index out of range in /home/ana/erros/f24.php:5VALUES (:nome)
execute(["name" => "Ana"])
O nome do marcador no execute não bate com o do SQL (:nome × name). Use os mesmos nomes.Prepared Statements
Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory in /home/ana/erros/f21.php:2new PDO("mysql:host=localhost;dbname=loja", …)O servidor MySQL/MariaDB não está rodando (ou não está nesse endereço). Ligue o serviço ou confira o host.MySQL e MariaDB

JSON, datas e valores inválidos

Mensagem realCódigo que provocaCausa e correçãoAula
Fatal error: Uncaught JsonException: Syntax error in /home/ana/erros/e45.php:2json_decode("{nome: 'Ana'}", flags: JSON_THROW_ON_ERROR)JSON inválido: as chaves e os textos precisam de aspas duplas: {"nome": "Ana"}. (Sem JSON_THROW_ON_ERROR, json_decode só devolve null, em silêncio.)JSON
Fatal error: Uncaught DateMalformedStringException: Failed to parse time string (31/12/2026) at position 0 (3): Unexpected character in /home/ana/erros/f30.php:2new DateTime("31/12/2026")O PHP não entende o formato brasileiro direto. Use "2026-12-31" ou DateTime::createFromFormat("d/m/Y", "31/12/2026").Datas e Horas
Fatal error: Uncaught ValueError: str_repeat(): Argument #2 ($times) must be greater than or equal to 0 in /home/ana/erros/e47.php:2str_repeat("-", -1)ValueError: o tipo está certo, mas o valor não é aceito. Confira o valor antes.Funções de String
Fatal error: Uncaught ValueError: max(): Argument #1 ($value) must contain at least one element in /home/ana/erros/f39.php:3max([])Maior valor de uma lista vazia. Confira count($lista) > 0 antes.Funções de Array
Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in /home/ana/erros/f05.php:3count(null)Contar algo que não é array. Use count($itens ?? []).Funções de Array
Fatal error: Uncaught TypeError: implode(): Argument #2 ($array) must be of type ?array, string given in /home/ana/erros/f13.php:2implode(", ", "maçã")O segundo argumento precisa ser um array.Funções de Array

Limites: memória, tempo e recursão

Mensagem realCódigo que provocaCausa e correçãoAula
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 8388616 bytes) in /home/ana/erros/e43.php on line 4ini_set("memory_limit", "8M");
um laço que põe 10 milhões de itens num array
O programa passou do limite de memória (memory_limit, 128 MB por padrão). Processe os dados aos poucos (linha a linha, página a página) em vez de carregar tudo.Ler e Escrever Arquivos
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 262144 bytes) in /home/ana/erros/e42.php on line 2function f() { return f(); }Recursão sem fim: a função chama a si mesma para sempre até a memória acabar. Na máquina da Ana, o Stack trace desse erro teve 1.220.313 linhas. Toda recursão precisa de um caso que para.Recursão
Fatal error: Maximum execution time of 1 second exceeded in /home/ana/erros/f10.php on line 3set_time_limit(1);
while (true) {}
Passou do tempo máximo (max_execution_time: 30 s no servidor web; sem limite no terminal). Normalmente é um laço que nunca termina: confira a condição.while

Deprecated (vai deixar de funcionar)

O código funciona hoje, mas o PHP avisa que aquilo será removido. Conserte agora: na próxima versão pode virar erro.

Mensagem realCódigo que provocaCorreçãoDesde
Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in /home/ana/erros/e36.php on line 2strlen(null)Uma função de texto recebeu null (campo de formulário que não veio, coluna vazia do banco). Use strlen($x ?? "").PHP 8.1
Deprecated: Implicit conversion from float 7.5 to int loses precision in /home/ana/erros/e35.php on line 4$lista[7.5]Um número com casas decimais foi usado onde só cabe inteiro (as casas se perdem). Converta de propósito: (int), round, intdiv.PHP 8.1
Deprecated: Using ${var} in strings is deprecated, use {$var} instead in /home/ana/erros/e37.php on line 3"Olá, ${nome}!"Escreva "Olá, {$nome}!" ou "Olá, $nome!".PHP 8.2
Deprecated: f(): Optional parameter $a declared before required parameter $b is implicitly treated as a required parameter in /home/ana/erros/e39.php on line 2function f($a = 1, $b)Parâmetros com valor padrão vão por último: function f($b, $a = 1).PHP 8.0
Deprecated: f(): Implicitly marking parameter $s as nullable is deprecated, the explicit nullable type must be used instead in /home/ana/erros/e38.php on line 2function f(string $s = null)Diga que aceita null: function f(?string $s = null).PHP 8.4
Deprecated: Non-canonical cast (integer) is deprecated, use the (int) cast instead in /home/ana/erros/e40.php on line 2(integer) "5"Use as formas curtas: (int), (bool), (float), (string).PHP 8.5
Deprecated: Case statements followed by a semicolon (;) are deprecated, use a colon (:) instead in /home/ana/erros/e53.php on line 4case 5;Use dois-pontos: case 5:.PHP 8.5
Deprecated: Using null as an array offset is deprecated, use an empty string instead in /home/ana/erros/e54.php on line 3$a[null] = 1;Uma variável null foi usada como chave. Confira de onde ela vem; se quer mesmo a chave vazia, use "".PHP 8.5
Deprecated: The backtick (`) operator is deprecated, use shell_exec() instead in /home/ana/erros/e60.php on line 2echo `ls`;Use shell_exec("ls").PHP 8.5
O que não gera erro (e engana)
  • (int) "12abc" vale 12, sem aviso nenhum; e "12abc" == 12 é false. Veja Conversão de Tipos.
  • json_decode sem JSON_THROW_ON_ERROR devolve null em silêncio quando o JSON está errado; pergunte com json_last_error_msg().
  • Esquecer o ; logo antes de ?> não é erro: echo "Oi" ?> funciona.

Missão: zero avisos

O programa da seção Os níveis tem três problemas, um em cada linha que gera mensagem. Rode, leia as mensagens de cima para baixo e conserte uma por vez.

Missão: faça o programa mostrar Aluna: Ana, Notas: 7, 8 e Média: 7.5 sem nenhum Warning ou erro. Dicas: a chave tem outro nome; um array não vira texto sozinho (implode); quantas notas há? (count).

<?php
$aluno = ["nome" => "Ana", "notas" => [7, 8]];
echo "Aluna: " . $aluno["Nome"] . "\n";
echo "Notas: " . $aluno["notas"] . "\n";
$quantidade = 0;
echo "Média: " . array_sum($aluno["notas"]) / $quantidade . "\n";
<?php
$aluno = ["nome" => "Ana", "notas" => [7, 8]];
echo "Aluna: " . $aluno["nome"] . "\n";
echo "Notas: " . implode(", ", $aluno["notas"]) . "\n";
$quantidade = count($aluno["notas"]);
echo "Média: " . array_sum($aluno["notas"]) / $quantidade . "\n";
$ php missao-sol.php
Aluna: Ana
Notas: 7, 8
Média: 7.5

Exercícios

1. A mensagem é Parse error: syntax error, unexpected token "echo" … on line 8. Onde está o erro, provavelmente?

2. Depois de um Warning, o programa…

3. Call to a member function depositar() on null quer dizer que…

4. Você vê Cannot modify header information - headers already sent by (output started at index.php:1). O que conferir primeiro?

Complete para ler a chave sem aviso quando ela não existir (o padrão é "visitante"):

$nome = $_GET["nome"] "visitante";

Que comando confere só a sintaxe de um arquivo, sem rodar?

php index.php

Resumo

  • Toda mensagem tem nível, texto, arquivo e linha. "Uncaught X" = exceção X não tratada; o Stack trace mostra o caminho até ela.
  • Parse error: nada roda; olhe também a linha anterior. Fatal error: para. Warning/Notice: continua com valor errado. Deprecated: funciona, mas vai mudar.
  • Os campeões: Undefined variable, Undefined array key, … on null, Call to undefined function, headers already sent, no such table.
  • Conserte a primeira mensagem e rode de novo; muitas das seguintes somem junto.
  • php -l confere a sintaxe; no site no ar, os erros vão para o log, não para a tela (Depurar).