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.
- O que é uma constante e quando usar uma no lugar de uma variável.
- Como criar constantes com
define()e comconst, 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ável | Constante | |
|---|---|---|
| Escrita | $taxa (com cifrão) | TAXA (sem cifrão, em maiúsculas) |
| Pode mudar de valor? | Sim, quando quiser | Não: o valor é definido uma vez |
| Bom para | Dados que mudam: o nome do cliente, o total do carrinho | Configuraçõ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,
nullou 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:
const | define() | |
|---|---|---|
| Valor calculado com variáveis ou funções | Nã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ço | Não: só no "nível de cima" do arquivo | Sim |
| Dentro de uma classe | Sim (constantes de classe, aula static) | Não |
Nome montado na hora ("TAXA_" . $estado) | Não | Sim |
| Quando o PHP cria | Ao 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";
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
| Constante | Vale | Uso típico |
|---|---|---|
__LINE__ | O número da linha atual | Mensagens de depuração ("cheguei na linha 42") |
__FILE__ | O caminho completo do arquivo atual | Registros de erro |
__DIR__ | A pasta do arquivo atual | Incluir 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étodo | Aulas de orientação a objetos |
__NAMESPACE__ | O namespace atual | Aula 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
| Constante | Vale | Para 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_VERSION | 8, 5 | Comparar versões |
PHP_EOL | A 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_EPSILON | Limites dos números | Aula 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 erro | Aula Tipos de Erro |
JSON_PRETTY_PRINT, JSON_UNESCAPED_UNICODE | Opções do json_encode | Aula 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
| Escrita | O 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) |
NOME | Usa 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_PI | Constantes nativas |
Exercícios
1. Criar com const
Complete para criar a constante FRETE_GRATIS com o valor 100:
2. A pasta do arquivo
Complete com a constante mágica que dá a pasta do arquivo atual:
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 deif.- 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.