define() vs const em PHP: qual escolher e por que é importante

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

define() vs const em PHP: a batalha dos titãs na declaração de constantes

\n\n

Você já se perguntou por que o PHP tem duas maneiras diferentes de declarar uma constante? Parece redundância, não é? Mas o diabo, como sempre, está nos detalhes. Essa dúvida no Stack Overflow já acumulou milhares de visualizações, e por um bom motivo — a diferença entre define() e const pode impactar seriamente a arquitetura do seu código.

\n\n

Hoje vamos esclarecer tudo de uma vez por todas. Você vai aprender não apenas as diferenças de sintaxe, mas também quando cada ferramenta oferece uma vantagem real. Vamos nessa!

\n\n

Uma breve introdução: o que é uma constante no PHP?

\n\n

Uma constante é um identificador para um valor simples. A principal característica: o valor não pode ser alterado durante a execução do script (ao contrário de uma variável). Por padrão, constantes diferenciam maiúsculas de minúsculas, mas isso pode ser configurado (spoiler: com define()).

\n\n

Exemplo de uma constante clássica:

\n\n
<?php\ndefine("MAX_UPLOAD_SIZE", 10485760); // 10 MB em bytes\necho MAX_UPLOAD_SIZE; // 10485760\n?>
\n\n

A mesma coisa, mas com const:

\n\n
<?php\nconst MAX_UPLOAD_SIZE = 10485760;\necho MAX_UPLOAD_SIZE;\n?>
\n\n

Parece igual, né? Mas vamos mais fundo.

\n\n

Principais diferenças entre define() e const

\n\n

Vamos organizar tudo. Aqui estão as diferenças essenciais que todo desenvolvedor PHP precisa conhecer.

\n\n

1. Momento da declaração: compilação vs execução

\n\n

Essa é a diferença mais fundamental.

\n\n
    \n
  • const — é declarado durante a fase de compilação. Isso significa que você não pode usar const dentro de loops, condicionais ou funções. Ele deve ser declarado no "corpo" da classe (para constantes de classe) ou no escopo global.
  • \n
  • define() — é executado em tempo de execução. Você pode colocá-lo em qualquer lugar: dentro de if, for, while, até mesmo em uma função (embora isso seja uma má prática).
  • \n
\n\n

Exemplo que não funciona com const:

\n\n
<?php\nif (PHP_OS === 'WINNT') {\n    const PLATFORM = 'Windows';\n    // Erro fatal: Não é possível usar const em estrutura de controle\n}\n?>
\n\n

Já com define() — funciona perfeitamente:

\n\n
<?php\nif (PHP_OS === 'WINNT') {\n    define('PLATFORM', 'Windows');\n    echo PLATFORM; // Windows\n}\n?>
\n\n

2. Tipos de dados: arrays e objetos

\n\n

Por muito tempo, define() só suportava tipos escalares (strings, números, booleanos). A partir do PHP 7, define() passou a aceitar arrays.

\n\n

const também suporta arrays (desde o PHP 5.6), mas não suporta objetos ou expressões:

\n\n
<?php\n// Funciona com PHP 7+\ndefine('FRUITS', ['apple', 'banana', 'cherry']);\necho FRUITS[1]; // banana\n\n// Também funciona (PHP 5.6+)\nconst COLORS = ['red', 'green', 'blue'];\n\n// Já isso — erro!\n// const RESULT = 2 + 3; // Funciona, é uma expressão constante\n// const DYNAMIC = rand(1, 10); // Erro! Não é expressão constante\n?>
\n\n

Importante: define() pode usar o resultado de funções (define('SITE_NAME', get_site_name())), enquanto const aceita apenas expressões constantes (números, strings, outras constantes).

\n\n

3. Namespace e escopo

\n\n

Aqui há uma nuance sutil, mas importante.

\n\n
    \n
  • define() — sempre cria uma constante global. Mesmo se você chamá-lo dentro de um namespace, a constante estará acessível de qualquer lugar.
  • \n
  • const — segue as regras de namespace. Uma constante declarada no namespace MyApp\\Config será chamada de MyApp\\Con
  • \n

Blogs

Book Recommendations