PHP Constantes

Algumas informações do programa não deveriam mudar nunca enquanto ele roda: o nome da loja, a taxa de entrega, o número máximo de parcelas, o valor de π. Para elas, existe a constante: uma caixa com etiqueta, como a variável, mas lacrada. Depois de criada, ninguém troca o valor. Nesta aula você aprende as duas formas de criar constantes (define e const), conhece as constantes que o PHP já traz prontas e vê o que acontece quando alguém tenta mudar uma.

Você vai aprender
  • O que é uma constante e quando usar uma no lugar de uma variável.
  • Como criar constantes com define() e com const, e a diferença entre os dois.
  • Por que as constantes são escritas em MAIÚSCULAS.
  • As constantes mágicas __LINE__, __FILE__ e __DIR__.
  • Constantes que o PHP já traz: PHP_VERSION, PHP_EOL, M_PI, PHP_INT_MAX…
  • Os avisos e erros reais de redefinir e de usar uma constante que não existe.

Os programas desta aula rodaram com o PHP 8.5 na máquina fictícia da Ana, na pasta ~/site.


A ideia: a placa na parede

Na lojinha da Ana, o preço do dia fica num quadro branco: ela apaga e escreve outro quando quer. Isso é uma variável. Já o nome da loja está numa placa de metal pregada na fachada. Ninguém muda a placa no meio do expediente. Isso é uma constante.

VariávelConstante
Escrita$taxa (com cifrão)TAXA (sem cifrão, em maiúsculas)
Pode mudar de valor?Sim, quando quiserNão: o valor é definido uma vez
Bom paraDados que mudam: o nome do cliente, o total do carrinhoConfigurações e valores fixos: nome da loja, taxa, limite, π

Por que não usar uma variável e "simplesmente não mudar"? Porque num programa grande, alguém (às vezes você mesmo, meses depois) muda sem querer. A constante faz o PHP garantir que isso não aconteça. E ela tem outra vantagem: o nome explica o número. $total + TAXA_ENTREGA diz muito mais que $total + 7.5.


1. Criar com const

A forma mais usada no PHP moderno é a palavra const (de constant):

<?php
const NOME_LOJA = "Lojinha da Ana";
const TAXA_ENTREGA = 7.5;
const CORES = ["azul", "verde"];
echo NOME_LOJA, "\n";
echo TAXA_ENTREGA, "\n";
echo CORES[1], "\n";
$ php loja.php
Lojinha da Ana
7.5
verde
const
A palavra que cria a constante.
NOME_LOJA
O nome. Sem cifrão. As regras de nome são as mesmas das variáveis (letra ou _ no começo; letras, números e _ depois).
= "Lojinha da Ana";
O valor, que nunca mais muda. Pode ser string, número, booleano, null ou array.
echo NOME_LOJA
Para usar, escreva só o nome, também sem cifrão.

Por que MAIÚSCULAS?

O PHP não exige, mas é uma convenção seguida por praticamente todo programador: constantes em MAIÚSCULAS, com as palavras separadas por _ (o estilo se chama SCREAMING_SNAKE_CASE, "cobra gritando"). Assim, quem lê o código sabe na hora: $taxa pode mudar; TAXA não. E, ao contrário das funções, os nomes de constantes diferenciam maiúsculas de minúsculas: TAXA e taxa são constantes diferentes.


2. Criar com define()

A forma mais antiga é a função define ("definir"). O nome vai entre aspas, como texto, e o valor depois da vírgula:

<?php
define("TAXA_ENTREGA", 7.5);
echo TAXA_ENTREGA, "\n";
var_dump(defined("TAXA_ENTREGA"));
var_dump(defined("NAO_EXISTE"));
$x = 2;
define("DOBRO", $x * 2);
echo DOBRO, "\n";
$ php definir.php
7.5
bool(true)               « defined: "a constante TAXA_ENTREGA existe?"
bool(false)
4                        « define aceita um valor calculado com variáveis
define("NOME", valor)
Cria a constante NOME. Repare nas aspas: aqui o nome é um texto.
defined("NOME")
Pergunta se a constante existe (true/false). Também com o nome entre aspas.

const ou define?

Os dois criam constantes que funcionam igual. As diferenças estão em onde e com o quê você pode criá-las:

constdefine()
Valor calculado com variáveis ou funçõesNão (só valores fixos e contas com outras constantes, como 3 * 3)Sim: define("DOBRO", $x * 2)
Dentro de um if, de uma função, de um laçoNão: só no "nível de cima" do arquivoSim
Dentro de uma classeSim (constantes de classe, aula static)Não
Nome montado na hora ("TAXA_" . $estado)NãoSim
Quando o PHP criaAo ler o arquivo (antes de rodar)Quando a linha é executada

Regra prática: use const por padrão: é mais curto, fica claro no topo do arquivo e é o que você vai usar nas classes. Use define quando o valor depender de algo calculado ou quando a constante só deve existir numa condição.

Veja o que o PHP responde quando você força o const fora do lugar:

$ cat const-variavel.php
<?php
$x = 2;
const DOBRO = $x * 2;
$ php const-variavel.php

Fatal error: Constant expression contains invalid operations in /home/ana/site/const-variavel.php on line 3
Stack trace:
#0 {main}
$ cat const-no-if.php
<?php
if (true) {
    const A = 1;
}
$ php const-no-if.php

Parse error: syntax error, unexpected token "const" in /home/ana/site/const-no-if.php on line 3

Constant expression contains invalid operations = "a expressão constante contém operações inválidas": o const não pode usar $x. Unexpected token "const": o const não é aceito dentro do if. Nos dois casos, a saída é o define.

Missão: o número 12 está "solto" no meio do texto. Crie uma constante LIMITE_PARCELAS com o valor 12 (com const ou define) e use-a no echo para mostrar Em até 12x sem juros. Dica: constantes não funcionam dentro das aspas; use o ponto para juntar.

<?php
echo "Em até 12x sem juros\n";
<?php
const LIMITE_PARCELAS = 12;
echo "Em até " . LIMITE_PARCELAS . "x sem juros\n";
Constante não funciona dentro de aspas

A interpolação das aspas duplas só reconhece variáveis (com $). Uma constante dentro do texto é só texto:

$ php aspas.php              « echo "Loja: NOME_LOJA\n";  e  echo "Loja: " . NOME_LOJA . "\n";
Loja: NOME_LOJA
Loja: Lojinha da Ana

Junte com o ponto (aula Operadores de String) ou use printf (aula printf e sprintf).


3. Tentar mudar uma constante

O que acontece se alguém tentar trocar o valor? Depende de como tentar.

Atribuir com =: o PHP nem aceita o arquivo

$ cat mudar.php
<?php
const TAXA = 5;
TAXA = 10;
$ php mudar.php

Parse error: syntax error, unexpected token "=" in /home/ana/site/mudar.php on line 3

Só variáveis podem receber valor com =. Para o PHP, TAXA = 10 é uma frase sem sentido.

Definir de novo: um aviso (e erro no futuro)

<?php
define("TAXA", 5);
define("TAXA", 10);
echo TAXA, "\n";
$ php redefinir.php

Warning: Constant TAXA already defined, this will be an error in PHP 9 in /home/ana/site/redefinir.php on line 3
5                        « a segunda definição foi ignorada

Constant TAXA already defined, this will be an error in PHP 9 = "a constante TAXA já foi definida; isto será um erro no PHP 9". O valor continua 5. Com const TAXA = 10; repetido, a mensagem é a mesma. Se você precisa definir "só se ainda não existir" (comum em arquivos de configuração), pergunte antes: if (!defined("TAXA")) { define("TAXA", 5); }.


4. Constantes mágicas: __LINE__, __FILE__, __DIR__

O PHP tem algumas constantes especiais, escritas com dois sublinhados antes e depois do nome. São chamadas de "mágicas" porque o valor muda conforme o lugar onde aparecem no código:

<?php
echo __LINE__, "\n";
echo __FILE__, "\n";
echo __DIR__, "\n";
echo "Esta é a linha ", __LINE__, "\n";
$ php magicas.php
2                        « o número da linha onde o __LINE__ está
/home/ana/site/magicas.php
/home/ana/site
Esta é a linha 5
ConstanteValeUso típico
__LINE__O número da linha atualMensagens de depuração ("cheguei na linha 42")
__FILE__O caminho completo do arquivo atualRegistros de erro
__DIR__A pasta do arquivo atualIncluir outros arquivos com segurança: require __DIR__ . "/config.php"; (aula include e require)
__FUNCTION__O nome da função onde estáAula Funções
__CLASS__, __METHOD__O nome da classe / do métodoAulas de orientação a objetos
__NAMESPACE__O namespace atualAula Namespaces

O __DIR__ é o mais importante na prática: com ele, um arquivo encontra os vizinhos não importa de qual pasta o programa foi chamado. No editor do guia, os caminhos mostrados são os do sistema de arquivos do navegador, diferentes dos da Ana.


5. Constantes que o PHP já traz

O PHP vem com centenas de constantes prontas. Algumas que você vai ver bastante:

<?php
echo PHP_VERSION, "\n";
echo PHP_MAJOR_VERSION, ".", PHP_MINOR_VERSION, "\n";
echo PHP_OS_FAMILY, "\n";
echo PHP_INT_MAX, "\n";
echo M_PI, "\n";
var_dump(M_PI);
echo "a", PHP_EOL, "b", PHP_EOL;
$ php nativas.php
8.5.8                    « a versão do PHP que está rodando
8.5
Linux                    « o sistema operacional
9223372036854775807
3.1415926535898          « o echo mostra 14 algarismos
float(3.141592653589793)
a
b                        « PHP_EOL é a quebra de linha
ConstanteValePara quê
PHP_VERSION"8.5.8" (no laboratório)Saber qual PHP está rodando (veja Versões do PHP). No editor do guia aparece a versão do PHP do navegador.
PHP_MAJOR_VERSION, PHP_MINOR_VERSION8, 5Comparar versões
PHP_EOLA quebra de linha do sistema ("\n" no Linux e no macOS, "\r\n" no Windows)Escrever arquivos de texto e saídas de terminal
PHP_OS_FAMILY"Linux", "Windows", "Darwin" (macOS)Saber o sistema. No editor do guia, que roda dentro do navegador, aparece "Unknown" ("desconhecido").
PHP_INT_MAX, PHP_INT_MIN, PHP_FLOAT_EPSILONLimites dos númerosAula int e float
M_PIπ = 3,14159…Geometria (área do círculo: M_PI * $r ** 2)
E_ALL, E_WARNING…Números que representam tipos de erroAula Tipos de Erro
JSON_PRETTY_PRINT, JSON_UNESCAPED_UNICODEOpções do json_encodeAula var_dump e print_r
PHP_EOL ou "\n"?

PHP_EOL (end of line, "fim de linha") se adapta ao sistema. Para páginas web, tanto faz: o navegador ignora quebras de linha no HTML (use <br> ou <p>). Para programas de terminal e arquivos, muita gente prefere PHP_EOL. Neste guia usamos "\n" nos exemplos de terminal porque é mais curto e cabe dentro das aspas duplas.

Experimente: rode e veja a versão e o sistema do PHP que roda no seu navegador (o sistema aparece como Unknown: o PHP do guia não está num Linux nem num Windows, e sim dentro do navegador). Depois calcule a área de um círculo de raio 3 com M_PI * 3 ** 2.

<?php
echo "PHP ", PHP_VERSION, " em ", PHP_OS_FAMILY, PHP_EOL;
echo "Linha atual: ", __LINE__, PHP_EOL;
echo "Pi: ", M_PI, PHP_EOL;

Quando dá errado

Fatal error: Uncaught Error: Undefined constant "..."
$ cat sem-constante.php
<?php
echo TAXA_ENTREGA;
$ php sem-constante.php

Fatal error: Uncaught Error: Undefined constant "TAXA_ENTREGA" in /home/ana/site/sem-constante.php:2
Stack trace:
#0 {main}
  thrown in /home/ana/site/sem-constante.php on line 2

O que significa: a constante não existe: nome digitado errado, diferença de maiúsculas (const taxa × TAXA), o define ainda não rodou, ou você esqueceu o $ de uma variável (echo nome;). Diferente da variável indefinida (só Warning), a constante indefinida para o programa.

Como consertar: confira o nome letra por letra, e se é variável (precisa de $) ou constante.

Warning: Constant ... already defined, this will be an error in PHP 9

O que significa: a mesma constante foi definida duas vezes. Acontece muito quando um arquivo de configuração é incluído duas vezes.

Como consertar: defina num lugar só; use require_once (aula include e require) ou if (!defined("NOME")).

Fatal error: Constant expression contains invalid operations

O que significa: o const recebeu algo que depende de variável ou de função.

Como consertar: use define("NOME", $valor).

Parse error: syntax error, unexpected token "=" ao mudar uma constante

O que significa: constantes não aceitam = depois de criadas.

Como consertar: se o valor precisa mudar, ele não é constante: use uma variável.


Referência rápida

EscritaO que faz
const NOME = valor;Cria a constante (no topo do arquivo ou numa classe)
define("NOME", valor);Cria a constante (em qualquer lugar, aceita valor calculado)
NOMEUsa a constante (sem $, sem aspas)
defined("NOME")A constante existe?
constant("NOME")Lê uma constante cujo nome está num texto
__LINE__, __FILE__, __DIR__Linha, arquivo e pasta atuais
PHP_VERSION, PHP_EOL, PHP_INT_MAX, M_PIConstantes nativas

Exercícios

1. Criar com const

Complete para criar a constante FRETE_GRATIS com o valor 100:

FRETE_GRATIS = 100;

2. A pasta do arquivo

Complete com a constante mágica que dá a pasta do arquivo atual:

require . "/config.php";

3. Qual é a forma certa de usar a constante TAXA?

4. Com $estado = "SP";, qual linha funciona?

5. O que acontece ao rodar define("A", 1); define("A", 2); echo A; no PHP 8.5?

Missão final: as configurações da loja

Missão: crie duas constantes: NOME_LOJA com "Lojinha da Ana" e TAXA_ENTREGA com 7.5. Mostre o nome da loja na primeira linha e, na segunda, Total com entrega: 37.5, somando $subtotal com a constante (não escreva 7.5 na conta).

<?php
// crie as constantes aqui

$subtotal = 30;
// mostre o nome da loja e o total aqui
<?php
const NOME_LOJA = "Lojinha da Ana";
const TAXA_ENTREGA = 7.5;

$subtotal = 30;
echo NOME_LOJA . "\n";
echo "Total com entrega: " . ($subtotal + TAXA_ENTREGA) . "\n";

Resumo

  • Constante = caixa lacrada: recebe um valor uma vez e nunca mais muda. Sem $, em MAIÚSCULAS por convenção.
  • const NOME = valor; é a forma padrão (topo do arquivo, valores fixos). define("NOME", valor) aceita valores calculados e funciona dentro de if.
  • Constantes não funcionam dentro de aspas: junte com o ponto.
  • Mudar com = é Parse error; definir de novo dá Warning (erro no PHP 9); usar uma que não existe é Fatal error: Undefined constant.
  • Mágicas: __LINE__, __FILE__, __DIR__. Nativas: PHP_VERSION, PHP_EOL, PHP_INT_MAX, M_PI.