Entendendo Constantes OOP em PHP
Aprenda constantes de classe em PHP: declare com const, controle visibilidade, use arrays e expressões como valores e acesse via self, static ou nome da classe.
Uma constante de classe é um valor fixo e nomeado que pertence a uma classe, e não a um único objeto. Ela é definida uma vez, nunca pode ser reatribuída em tempo de execução e é compartilhada por cada instância da classe. As constantes são a forma de dar nomes significativos aos valores "mágicos" dos quais seu código depende — uma taxa de imposto, uma string de status, uma versão de API — para que eles existam em um único lugar, em vez de ficarem espalhados como literais.
Este capítulo aborda como declarar constantes de classe com const, como lê-las com self, static e o nome da classe, como controlar sua visibilidade e como elas se comportam com herança e interfaces. Todos os exemplos abaixo funcionam em PHP 8.
Por que usar constantes de classe?
Use uma constante de classe quando um valor é conhecido antecipadamente e nunca deve mudar enquanto o script executa:
- Fonte única da verdade. Defina um valor como
Order::SHIPPING_FEEuma vez; cada chamador lê o mesmo número. - Legibilidade.
Circle::PIdiz muito mais do que um simples3.14159enterrado em um cálculo. - Segurança. O PHP rejeita qualquer tentativa de reatribuir uma constante, portanto um erro de digitação não pode sobrescrevê-la silenciosamente.
- Nenhum objeto necessário. Como uma constante pertence à classe, você pode lê-la sem criar uma instância.
As constantes de classe diferem das variáveis regulares de duas maneiras importantes: elas são escritas sem cifrão (MAX_USERS, não $MAX_USERS), e são imutáveis uma vez definidas.
Definindo uma constante de classe
Declare uma constante dentro do corpo da classe com a palavra-chave const, um nome (convencionalmente em UPPER_SNAKE_CASE) e um valor:
<?php
class MyClass {
const CONSTANT = 'constant value';
public function showConstant() {
echo self::CONSTANT . "\n";
}
}Isso define CONSTANT em MyClass. Uma constante de classe não é o mesmo que uma constante global criada com define(): const pertence à classe e é acessada através de ::, enquanto define() registra um nome no escopo global.
O valor pode ser uma expressão constante — um cálculo que o PHP pode resolver em tempo de compilação — e até mesmo um array:
<?php
class Circle {
const PI = 3.14159;
const TWO_PI = self::PI * 2; // built from another constant
const UNITS = ['mm', 'cm', 'm'];
}
echo Circle::TWO_PI . "\n"; // 6.28318
echo Circle::UNITS[1] . "\n"; // cmO que você não pode usar é qualquer coisa conhecida apenas em tempo de execução — chamadas de função, instâncias de objetos ou $variáveis não são permitidas no valor de uma constante.
Acessando uma constante de classe
A forma de ler uma constante depende de onde você está:
- De fora da classe, use o nome da classe:
MyClass::CONSTANT. - De dentro da classe, use a palavra-chave
self:self::CONSTANT.
constant value
constant valueA primeira linha lê a constante estaticamente pelo nome da classe — nenhum objeto necessário. A segunda passa por um método de instância que usa self::CONSTANT. Note que você acessa constantes com ::, nunca com o operador de objeto -> que você usa para propriedades.
Controlando a visibilidade
Desde o PHP 7.1, as constantes de classe aceitam os mesmos modificadores de visibilidade que propriedades e métodos: public (o padrão), protected e private. Isso permite ocultar detalhes de implementação que pertencem à classe, mas não devem ser lidos de fora.
<?php
class Config {
public const VERSION = '2.0';
protected const API_KEY = 'secret-123';
private const SALT = 'x9f2';
public function describe(): string {
return self::VERSION . ' / ' . self::API_KEY . ' / ' . self::SALT;
}
}
echo Config::VERSION . "\n"; // 2.0 — public, readable anywhere
$c = new Config();
echo $c->describe() . "\n"; // 2.0 / secret-123 / x9f2Aqui Config::VERSION é acessível em qualquer lugar, enquanto API_KEY e SALT só podem ser acessados de dentro da classe (ou, no caso de protected, suas subclasses). Tentar ler Config::SALT de fora gera um erro.
Constantes e herança
Subclasses herdam as constantes de seus pais e podem substituí-las. A palavra-chave que você usa para ler a constante decide qual versão você obtém:
self::NAMEé resolvido quando o código é escrito — sempre significa a constante na classe onde o método está definido.static::NAMEé resolvido em tempo de execução em relação à classe real que foi chamada. Isso é chamado de late static binding.
<?php
interface HasStatus {
const ACTIVE = 'active'; // interface constants are always public
}
class Order implements HasStatus {
const SHIPPING_FEE = 5.00;
public function status(): string {
return self::ACTIVE;
}
}
class ExpressOrder extends Order {
const SHIPPING_FEE = 15.00;
public function fee(): float {
return static::SHIPPING_FEE; // uses the called class's value
}
}
echo Order::ACTIVE . "\n"; // active (inherited from the interface)
echo (new ExpressOrder())->fee() . "\n"; // 15
echo (new ExpressOrder())->status() . "\n"; // activeInterfaces também podem declarar constantes; elas são implicitamente public e compartilhadas por cada classe implementadora. Se você precisar de uma constante que as subclasses não devem substituir, marque-a como final (PHP 8.1+): final const ID = 100;. O PHP 8.3 também adicionou constantes tipadas, por exemplo const string LABEL = 'base';.
Para mais informações sobre o comportamento de subclasses, consulte PHP Inheritance, e para o recurso de dados em nível de classe relacionado, PHP Static Properties.
Armadilhas comuns
- Sem cifrão.
const RATE = 0.2;— escrever$RATEé um erro de sintaxe. ::, não->. As constantes são sempre acessadas com o operador de resolução de escopo.- Valores em tempo de execução são rejeitados. O valor de uma constante deve ser uma expressão constante;
const NOW = time();não vai compilar. selfvsstatic. Usestatic::quando você pretende que uma subclasse possa substituir o valor; caso contrário,self::é a escolha mais segura e previsível.
Conclusão
As constantes de classe fornecem valores nomeados, imutáveis e com escopo de classe, definidos com const e lidos através de ::. Use-as para centralizar valores fixos, melhorar a legibilidade e bloquear dados que nunca devem mudar em tempo de execução. Combine-as com modificadores de visibilidade para ocultar aspectos internos e lembre-se da distinção entre self e static quando a herança entrar em cena.