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.
- 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
~/errosda 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ço | O que quer dizer |
|---|---|
Fatal error | O 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 given | O texto do problema: "o argumento nº 1 ($n) de dobro() precisa ser do tipo int; foi dado um string". |
called in … on line 5 | Onde a função foi chamada (a linha que você precisa consertar). |
defined in …:2 | Onde 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 2 | Onde a exceção foi lançada. |
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 terminal | Quando aparece |
|---|---|---|---|
Parse error | nem começa: o PHP não conseguiu entender o arquivo | 255 | erro de digitação na sintaxe (falta ;, }, aspas) |
Fatal error | para na hora | 255 | exceçã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) | 0 | algo provavelmente errado: variável ou chave que não existe, arquivo que não abriu |
Notice (nota) | continua | 0 | algo estranho, mas que funcionou |
Deprecated (obsoleto) | continua normalmente | 0 | o 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):
| Onde | Como 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 servidor | O 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
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 real | Código que provoca | Causa e correção | Aula |
|---|---|---|---|
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 2 | echo "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 4 | return $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 4 | echo $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 4 | if (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 3 | echo "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 3 | echo "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 3 | echo $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 real | Código que provoca | Causa e correção | Aula |
|---|---|---|---|
Warning: Undefined variable $nome in /home/ana/erros/e08.php on line 2 | echo $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 2 | echo $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 3 | echo "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:2 | echo 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 3 | define("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 real | Código que provoca | Causa e correção | Aula |
|---|---|---|---|
Fatal error: Uncaught DivisionByZeroError: Division by zero in /home/ana/erros/e14.php:2 | echo 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:2 | echo 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 2 | echo "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:4 | echo "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:4 | public 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:4 | echo $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:3 | match ($nota) { 10 => …, 5 => … } com $nota = 7 | Nenhum braço do match casou com o valor. Acrescente o braço que falta ou um default => …. | match |
Funções
| Mensagem real | Código que provoca | Causa e correção | Aula |
|---|---|---|---|
Fatal error: Uncaught Error: Call to undefined function dobro() in /home/ana/erros/e16.php:2 | echo 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:2 | function 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:3 | function 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:3 | saudar(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 3 | duas function f(); ou include do mesmo arquivo duas vezes | Dois 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:3 | function 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 3 | echo 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:2 | array_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 2 | function 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(): intcalcular(); | 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 real | Código que provoca | Causa e correção | Aula |
|---|---|---|---|
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 4 | echo $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:4 | public 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:6 | echo $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:5 | Calc::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:3 | new 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:3 | new 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 3 | class 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 3 | a filha reescreve f com outro tipo de parâmetro | Ao 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 3 | a filha reescreve um método final | final = "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 3 | duas 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:3 | Status::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 real | Código que provoca | Causa e correção | Aula |
|---|---|---|---|
Warning: include(config.php): Failed to open stream: No such file or directory in /home/ana/erros/e23.php on line 2Warning: 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 2Fatal 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 2 | file_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 3 | echo "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 3 | echo "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 3 | dois 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:3 | htmlspecialchars($_GET["busca"]) com ?busca[]=a | O 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 real | Código que provoca | Causa e correção | Aula |
|---|---|---|---|
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:6 | inserir duas vezes o mesmo valor numa coluna UNIQUE | O 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:4 | INSERT 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:5 | VALUES (: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:2 | new 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 real | Código que provoca | Causa e correção | Aula |
|---|---|---|---|
Fatal error: Uncaught JsonException: Syntax error in /home/ana/erros/e45.php:2 | json_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:2 | new 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:2 | str_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:3 | max([]) | 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:3 | count(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:2 | implode(", ", "maçã") | O segundo argumento precisa ser um array. | Funções de Array |
Limites: memória, tempo e recursão
| Mensagem real | Código que provoca | Causa e correção | Aula |
|---|---|---|---|
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 8388616 bytes) in /home/ana/erros/e43.php on line 4 | ini_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 2 | function 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 3 | set_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 real | Código que provoca | Correção | Desde |
|---|---|---|---|
Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in /home/ana/erros/e36.php on line 2 | strlen(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 2 | function 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 2 | function 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 4 | case 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 2 | echo `ls`; | Use shell_exec("ls"). | PHP 8.5 |
(int) "12abc"vale12, sem aviso nenhum; e"12abc" == 12éfalse. Veja Conversão de Tipos.json_decodesemJSON_THROW_ON_ERRORdevolvenullem silêncio quando o JSON está errado; pergunte comjson_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"):
Que comando confere só a sintaxe de um arquivo, sem rodar?
Resumo
- Toda mensagem tem nível, texto, arquivo e linha. "Uncaught X" = exceção X não tratada; o
Stack tracemostra 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 -lconfere a sintaxe; no site no ar, os erros vão para o log, não para a tela (Depurar).