Última atualização:
Foto de uma criança se perguntando confusa: por quê o código dá erro mas funciona?
Foto de uma criança se perguntando confusa: por quê o código dá erro mas funciona?

Erro "Use of undefined constant" do PHP: o que é e como resolver?

Nawarian
Nawarian php

Se você programa ou está aprendendo PHP há algum tempo já deve ter visto um erro na sua tela ou arquivo de log que diz algo mais ou menos assim:

PHP Notice: Use of undefined constant nome - assumed 'nome' in /var/www/index.php on line 10

Hoje nós vamos falar sobre este erro, como identificar e corrigir de forma segura. Vem comigo!

Por que “Use of undefined constant” acontece?

Quando nós fazemos referência a uma constante que não foi declarada, o PHP decide que em vez de te devolver uma tela em branco ou com erros é melhor entender que você quis dizer que aquilo era uma string. É uma estratégia de melhor esforço (best effort) em vez de falhar cedo (fail first).

O erro Use of undefined constant acontece porque o PHP tenta perdoar uma falha que nós cometemos enquanto escrevemos um código ao não colocar strings entre aspas.

Por exemplo, o código abaixo funciona:

$arr = ["nome" => "Nawarian"];
echo $arr[nome];
// PHP Notice:  Use of undefined constant nome - assumed 'nome' in ...
// Nawarian

O código acima vai justamente gerar um erro Use of undefined constant nome - assumed 'nome' in .... Isto porque ao acessar a chave nome do array $arr não utilizamos uma string 'nome' mas sim uma constante nome que nunca foi declarada.

O PHP então perdoa este erro que cometemos e entende que estamos tentando fazer echo $arr['nome']. Mas como isto pode ter sido um erro da nossa parte, o PHP gera um erro do tipo notice que nos permite averiguar aquele pedaço de código para corrigirmos ou mesmo identificarmos bugs.

Como corrigir o erro “Use of undefined constant”?

O erro Use of undefined constant acontece, na maioria dos casos, porque tentamos utilizar uma string mas esquecemos de colocar as aspas. Nestes casos o ideal é corrigir o problema colocando aspas na palavra.

Por exemplo ao acessar a chave “pessoa” do array “arr” o seguinte código $arr[pessoa] gera erro mas funciona, enquanto o código $arr['pessoa'] funciona da mesma forma e sem erros.

Atenção! Em alguns casos pode ser que a intenção da pessoa que escreveu aquela linha fosse realmente de referenciar uma constante que foi definida em outro arquivo e nunca foi importada. Neste caso o correto não é transformar em string, mas sim fazer o include do arquivo que define a constante.

Como ler a mensagem de erro “Use of undefined constant”

Esta mensagem normalmente fica no seu arquivo error.logmas também pode ser enviada diretamente na tela em ambiente de desenvolvimento.

O template da mensagem é o seguinte:

PHP Notice:  Use of undefined constant <NOME> - assumed '<NOME>' in <ARQUIVO> on line <LINHA>

Vamos quebrar esta mensagem em partes:

PHP Notice: o tipo do erro que aconteceu de acordo com os níveis de erros da linguagem PHP.

Use of undefined constant <NOME>: indica que no código a constante <NOME> foi referenciada mas nunca foi definida. Deixa eu clarificar o que isso significa com o código a seguir:

const PESSOA = 'nawarian';
$arr = [
  'nawarian' => 'programador',
  'nickolas' => 'trabalhador'
];

echo $arr[PESSOA]; // programador
echo $arr[nickolas]; // Notice
echo $arr['nickolas']; // trabalhador

No exemplo acima $arr[PESSOA] não gera erro, porque a constante PESSOA foi definida na primeira linha do código. Já a linha $arr[nickolas] gera um erro Use of undefined constant nickolas porque estamos fazendo referência a uma constante nickolas que nunca foi declarada. Note que o correto neste caso é utilizar $arr['nickolas'].

assumed ‘<NOME>' in <ARQUIVO> on line <LINHA>: aqui temos a decisão que o PHP tomou por você: utilizar uma string em vez de constante. Como em $arr[nickolas] que vira $arr['nickolas'].

O PHP também te indica qual o nome do arquivo em que este problema aconteceu, e em qual linha. Desta forma você pode inspecionar o arquivo e verificar se este é realmente o comportamento que você gostaria que a sua aplicação tivesse.

Como identificar onde o “Use of undefined constant” ocorre?

Ao navegar pelo seu sistema você provavelmente vai gerar alguns erros. Estes erros são escritos num arquivo de log, normalmente chamado error.log. O caminho onde este arquivo é escrito fica definido na variável error_log do php.ini, você pode verificar o caminho tanto no php.ini quando utilizando a função phpinfo().

Ao verificar o arquivo error.log você pode buscar pelo texto “Use of undefined constant” e vai encontrar diferentes linhas com este erro. Leia o fim da linha e repare que ela tem o formato in /caminho/para/arquivo.php on line 100. Ora, é justamente aqui que você entende qual arquivo PHP está gerando este erro, e qual a linha em que ele acontece.

Consequências do erro “Use of undefined constant”

É importante que a gente seja sempre 100% intencional sobre o código que escrevemos. Eu escrevi sobre isso no artigo sobre programação por coincidência e como escrever códigos que outras pessoas entendem.

Uma das consequências do Use of undefined constant é que o nosso código fica mais imprevisível, porque nós permitimos que o PHP altere o comportamento do nosso código. Isto pode gerar falhas de software que se manifestam das formas mais estranhas possíveis. Além do mais, ao atualizar a versão do PHP pode acontecer de a nova versão remover este comportamento completamente.

Outra consequência disso é que o nosso arquivo de logs de erro fica poluído com mensagens do tipo Use of undefined constant. Estas mensagens não precisam existir porque o seu código está funcionando, só que não da forma como você o escreveu. Ao poluir o log com mensagens deste tipo, você perde a capacidade de prestar atenção em erros que realmente podem significar uma falha importante no seu sistema.

A última consequência que quero citar aqui é a da utilização de disco indevida. Eu já trabalhei com aplicações que para cada página acessada geravam-se cerca de 30 mil linhas de log do tipo Use of undefined constant. Isto gera uma superutilização de disco desnecessária e pode inclusive gerar problemas de manutenção em seus servidores e o aumento de custo de armazenamento.

Comentários