Uma constante é um nome para um valor que nunca muda enquanto o script roda. Declare com const MAX_USERS = 100; ou define('MAX_USERS', 100); e depois use o nome puro, sem $.
Por convenção, nomes de constantes ficam em UPPER_SNAKE_CASE. Elas são globais: uma constante declarada no topo de um arquivo é visível dentro de todas as funções sem global.
define() ou const
Os dois criam uma constante, mas funcionam em momentos diferentes. const é resolvido quando o PHP compila o arquivo, define() roda como qualquer outra chamada de função.
const | define() | |
|---|---|---|
Dentro de if, loops, funções | Não | Sim |
| Nome montado a partir de variável | Não | Sim |
| Constantes de classe | Sim | Não |
| Valor pode ser uma expressão | Sim, de constantes e literais | Sim, qualquer valor |
| Entra no namespace automaticamente | Sim | Não (passe o nome completo) |
Use const por padrão, porque é mais curto e verificado em tempo de compilação. Use define() quando a constante depender de uma condição ou de um nome calculado.
Constantes não podem ser alteradas
Atribuir a uma constante é um erro de sintaxe:
<?php
const LIMIT = 10;
LIMIT = 20;
PHP Parse error: syntax error, unexpected token "=" in /home/index.php on line 3
Definir a mesma constante duas vezes não é erro, mas o PHP imprime um aviso e mantém o primeiro valor:
<?php
define("LIMIT", 10);
define("LIMIT", 20);
echo LIMIT; // 10
Warning: Constant LIMIT already defined in /home/index.php on line 3
Quando um valor talvez já esteja definido (por exemplo, num arquivo de configuração carregado mais de uma vez), verifique antes com defined():
Arrays constantes
Uma constante pode guardar um array. Você pode lê-lo com NAME[key], percorrê-lo e passá-lo adiante, mas não modificá-lo.
Constantes de classe
Dentro de uma classe, const declara uma constante que pertence à classe. Leia com ClassName::NAME de fora e self::NAME ou static::NAME de dentro. Constantes de classe podem ter visibilidade, podem ser final e, desde o PHP 8.3, podem declarar um tipo.
Um grupo de constantes de classe relacionadas, como STATUS_NEW e STATUS_PAID, muitas vezes fica melhor como um enum, que também impede que valores inválidos circulem pelo código.
Constantes mágicas: LINE, FILE, DIR e outras
Constantes mágicas mudam de valor conforme o lugar onde aparecem. Elas são preenchidas em tempo de compilação.
A mais usada é __DIR__, o diretório do arquivo atual. Montar caminhos de include a partir dela faz com que funcionem não importa de qual diretório o script foi iniciado: require __DIR__ . '/config.php';. Veja include e require para o padrão completo.
Constantes nativas que vale a pena conhecer
O PHP define muitas constantes próprias. Estas aparecem o tempo todo:
PHP_EOL é o fim de linha do sistema onde o PHP roda ("\n" no Linux e no macOS, "\r\n" no Windows). Ela serve para texto escrito em arquivos e no terminal; na saída HTML uma quebra de linha não aparece, então use <br> ali.
Perguntas frequentes
Qual a diferença entre define() e const no PHP?
const é uma construção da linguagem resolvida quando o arquivo é compilado: funciona no nível superior e dentro de classes, mas não dentro de if, loops ou funções. define() é uma função chamada em tempo de execução, então funciona em qualquer lugar e o nome pode ser montado a partir de uma variável, mas não declara constantes de classe.
Uma constante PHP pode ser um array?
Sim. Tanto const COLORS = ['red', 'green']; quanto define('COLORS', ['red', 'green']); funcionam, e você lê um elemento com COLORS[0]. O array não pode ser modificado depois.
Como verifico se uma constante está definida no PHP?
Use defined('NAME'), que recebe o nome como string e retorna true ou false. Um padrão comum é if (!defined('APP_ENV')) { define('APP_ENV', 'production'); }. Para constantes de classe, passe 'ClassName::NAME'.
O que são constantes mágicas no PHP?
Constantes cujo valor depende de onde elas estão escritas: __LINE__ (linha atual), __FILE__ (caminho completo do arquivo), __DIR__ (o diretório dele), __FUNCTION__, __CLASS__, __METHOD__ e __NAMESPACE__. Elas são escritas com dois underscores de cada lado e não diferenciam maiúsculas de minúsculas.