define() vs const em PHP: a batalha dos titãs na declaração de constantes
\n\nVocê 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.
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\nUma breve introdução: o que é uma constante no PHP?
\n\nUma 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()).
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\nA mesma coisa, mas com const:
<?php\nconst MAX_UPLOAD_SIZE = 10485760;\necho MAX_UPLOAD_SIZE;\n?>\n\nParece igual, né? Mas vamos mais fundo.
\n\nPrincipais diferenças entre define() e const
\n\nVamos organizar tudo. Aqui estão as diferenças essenciais que todo desenvolvedor PHP precisa conhecer.
\n\n1. Momento da declaração: compilação vs execução
\n\nEssa é a diferença mais fundamental.
\n\n- \n
const— é declarado durante a fase de compilação. Isso significa que você não pode usarconstdentro 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 deif,for,while, até mesmo em uma função (embora isso seja uma má prática). \n
Exemplo que não funciona com const:
<?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\nJá com define() — funciona perfeitamente:
<?php\nif (PHP_OS === 'WINNT') {\n define('PLATFORM', 'Windows');\n echo PLATFORM; // Windows\n}\n?>\n\n2. Tipos de dados: arrays e objetos
\n\nPor muito tempo, define() só suportava tipos escalares (strings, números, booleanos). A partir do PHP 7, define() passou a aceitar arrays.
const também suporta arrays (desde o PHP 5.6), mas não suporta objetos ou expressões:
<?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\nImportante: 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).
3. Namespace e escopo
\n\nAqui 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 namespaceMyApp\\Configserá chamada deMyApp\\Con\n