Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

E_NOTICE e E_WARNING

Tudo bem, pessoal? Estou com uma dúvida!

Nota: Estou na versão 8.2.12 do php.

Gostaria de saber o que aconteceu aqui: Comecei a copiar o código e os erros que deveriam estar dando como E_NOTICE depois de um tempo viraram E_WARNING... Segue o código:

<?php

error_reporting(E_ALL); // mostra os error que são excluídos
// por padrão(ex: E_NOTICE, E_STRICT)
ini_set('display_errors', 1); 
ini_set('log_errors', 0);
ini_set('error_log', '/var/log/minha-aplicacao');

// E_NOTICE
echo $variavel;
echo $array[12];

// E_WARNING
echo CONSTANTE;

Mensagem de erro:

Warning: Undefined variable $variavel in C:\Users\eduardo.lima\Documents\PHPCurso\Curso5\php-exceptions-projeto-inicial\erros.php on line 13

Warning: Undefined variable $array in C:\Users\eduardo.lima\Documents\PHPCurso\Curso5\php-exceptions-projeto-inicial\erros.php on line 14

Warning: Trying to access array offset on value of type null in C:\Users\eduardo.lima\Documents\PHPCurso\Curso5\php-exceptions-projeto-inicial\erros.php on line 14

Fatal error: Uncaught Error: Undefined constant "CONSTANTE" in C:\Users\eduardo.lima\Documents\PHPCurso\Curso5\php-exceptions-projeto-inicial\erros.php:17
Stack trace:
#0 {main}
  thrown in C:\Users\eduardo.lima\Documents\PHPCurso\Curso5\php-exceptions-projeto-inicial\erros.php on line 17
2 respostas
solução!

Na versão PHP 8.0 e posteriores, algumas mudanças significativas foram feitas na maneira como o PHP lida com erros e avisos, o que explica o comportamento que você observou.

E_NOTICE para E_WARNING

Antes do PHP 8, tentar acessar uma variável não definida geraria um erro do tipo E_NOTICE, e tentar acessar um índice de array inexistente resultaria em E_WARNING. No PHP 8, esses casos agora emitem um E_WARNING para variáveis não definidas e um E_WARNING seguido por um TypeError quando se tenta acessar um índice de array inexistente em uma variável que é null ou não é um array. Isso é parte de um esforço para tornar o código PHP mais robusto e seguro, incentivando os desenvolvedores a corrigir potenciais erros no código que poderiam passar despercebidos em versões anteriores.

Mudança nos Erros de Constantes Não Definidas

Quanto à tentativa de usar uma constante não definida (echo CONSTANTE;), no PHP 7 e versões anteriores, isso geraria um aviso (E_WARNING) informando que a constante não foi encontrada e assumiria que CONSTANTE é uma string com o mesmo nome da constante ausente. No entanto, a partir do PHP 8, isso agora resulta em um Error fatal. Essa mudança torna o PHP mais estrito em relação a possíveis erros de digitação ou referências a constantes que realmente não existem, o que pode ajudar a identificar bugs mais cedo no ciclo de desenvolvimento.

Como Lidar com Essas Mudanças

Para lidar com essas mudanças, é importante revisar e atualizar seu código para garantir que todas as variáveis e constantes estejam devidamente definidas antes de serem usadas. Isso não apenas evita avisos e erros, mas também torna seu código mais limpo e menos propenso a bugs. Para variáveis, você pode usar isset() ou o operador null coalesce (??) para verificar se a variável está definida antes de usá-la. Para constantes, certifique-se de que estão definidas usando define() ou const antes de referenciá-las.

Exemplo de Correção

Para o código fornecido, você pode evitar os erros verificando as variáveis e constantes antes de usá-las:

error_reporting(E_ALL);
ini_set('display_errors', 1);

// Para evitar E_WARNING sobre variáveis não definidas
$variavel = $variavel ?? 'valor padrão';
echo $variavel;

$array = $array ?? [];
echo $array[12] ?? 'índice não definido';

// Para evitar o erro de constante não definida
defined('CONSTANTE') or define('CONSTANTE', 'Algum valor');
echo CONSTANTE;

Essas alterações tornarão seu código compatível com o PHP 8, evitando os novos tipos de avisos e erros, e também tornarão o código mais seguro e confiável.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Muito obrigado, Rafael! Entendi perfeitamente agora!