W3docs

const

Aprenda a usar a palavra-chave const em PHP para declarar constantes globais e de classe com exemplos práticos e dicas essenciais.

A palavra-chave const do PHP

Uma constante é um valor nomeado que não pode mudar durante a execução de um script. A palavra-chave const é uma das duas formas que o PHP oferece para declarar uma constante (a outra é a função define()). Ao contrário de uma variável, uma constante não tem o $ no início e, uma vez definida, não pode ser reatribuída nem removida com unset().

Este guia aborda o que const faz, como ela difere de define(), onde é permitido utilizá-la e as armadilhas mais comuns que costumam confundir os desenvolvedores.

Sintaxe

Você pode usar const no nível superior de um script (uma constante global) ou dentro de uma classe, interface ou trait (uma constante de classe):

const NAME = value;          // global constant
class ClassName {
  const NAME = value;        // class constant, accessed as ClassName::NAME
}

Por convenção, os nomes de constantes são escritos em UPPER_SNAKE_CASE. Um nome deve começar com uma letra ou sublinhado e conter apenas letras, dígitos e sublinhados.

const vs define()

O PHP oferece duas ferramentas com aparência semelhante, mas comportamentos diferentes. Conhecer as diferenças economiza tempo de depuração:

Característicaconstdefine()
AvaliadaEm tempo de compilaçãoEm tempo de execução
Pode ser usada condicionalmente (dentro de if)NãoSim
Funciona dentro de uma classeSim (constante de classe)Não
Nome a partir de variável/expressãoNãoSim (define($name, ...))
ValorApenas expressões constantesQualquer expressão

Regra geral: use const para valores fixos e sempre definidos (especialmente constantes de classe), e define() quando o nome ou o valor é decidido durante a execução do programa.

<?php
// define() can be conditional; const cannot.
if (!defined('ENVIRONMENT')) {
  define('ENVIRONMENT', 'production');
}

// This would be a fatal parse error — const cannot live inside an if-block:
// if (true) { const FOO = 1; }

Consulte o capítulo dedicado a define() e a visão geral de constantes PHP para mais informações.

Exemplos

Constante de classe e constante global

<?php

// Example 1 — a class constant referenced with self::
class Circle
{
  const PI = 3.14;
  public $radius;

  public function __construct($radius)
  {
    $this->radius = $radius;
  }

  public function getArea()
  {
    return self::PI * $this->radius * $this->radius;
  }
}

$myCircle = new Circle(5);
echo "Area of circle: " . $myCircle->getArea() . PHP_EOL;

// Output: Area of circle: 78.5

// Example 2 — a global constant
const MY_NAME = "John";
echo "My name is " . MY_NAME;

// Output: My name is John

Você lê uma constante de classe com o operador :: (resolução de escopo) — self::PI de dentro da classe e Circle::PI de fora. Uma constante global é usada pelo nome sem $. Para saber mais sobre classes, consulte classes e objetos em PHP e o capítulo sobre constantes de classe.

Expressões constantes e arrays

O valor de uma const deve ser uma expressão constante — algo que o PHP pode avaliar sem executar nenhum código. Você pode usar literais, operadores e outras constantes já definidas e (desde o PHP 5.6) o resultado pode ser um array.

<?php
const SECONDS_PER_MINUTE = 60;
const SECONDS_PER_HOUR   = SECONDS_PER_MINUTE * 60;  // built from another const
const ALLOWED_ROLES      = ['admin', 'editor', 'viewer'];

echo SECONDS_PER_HOUR . PHP_EOL;       // 3600
echo ALLOWED_ROLES[1] . PHP_EOL;       // editor

Chamadas de função e instâncias de objetos não são permitidas como valor de const, pois não podem ser resolvidas em tempo de compilação.

Constantes de classe: visibilidade, interfaces e final

Constantes de classe pertencem à classe, não a um objeto específico, portanto não é necessário ter uma instância para lê-las. Desde o PHP 7.1, você também pode atribuir um modificador de visibilidade a elas:

<?php
interface HasStatus
{
  // Interface constants are always public.
  const DEFAULT_STATUS = 'pending';
}

class Order implements HasStatus
{
  public const TAX_RATE   = 0.2;   // readable everywhere
  protected const MAX_QTY = 99;    // this class + subclasses
  private const SECRET    = 'x';   // this class only

  public function status(): string
  {
    return self::DEFAULT_STATUS;   // inherited from the interface
  }
}

echo Order::TAX_RATE . PHP_EOL;        // 0.2
echo (new Order())->status() . PHP_EOL; // pending

Interfaces também podem declarar constantes (sempre públicas) — veja interfaces PHP. Uma constante de classe pode ser marcada como final (PHP 8.1+) para impedir que subclasses a sobrescrevam.

Armadilhas comuns

  • Sem $ em uma constante. echo MY_NAME; funciona; echo $MY_NAME; procura uma variável e falha.
  • Não pode ser alterada ou removida. Reatribuir uma constante é um erro fatal; unset() não funciona em constantes.
  • Somente em tempo de compilação. Você não pode colocar const dentro de um if, laço ou função baseada em dados de tempo de execução — use define() para isso.
  • Constantes têm escopo global. Uma const global é visível dentro de funções sem usar global, ao contrário de uma variável comum.

Benefícios

  • Legibilidade: uma constante nomeada como TAX_RATE documenta a intenção muito melhor do que um número mágico.
  • Manutenibilidade: altere um valor em um único lugar em vez de procurar cada literal no código.
  • Segurança: o valor é somente leitura, portanto não pode ser sobrescrito por acidente em nenhum lugar do código.

Conclusão

A palavra-chave const define constantes em tempo de compilação — tanto globais quanto dentro de classes — que permanecem fixas durante toda a vida de um script. Use-a para valores fixos que você sempre conhece de antemão, prefira constantes de classe para valores que pertencem a um tipo e recorra a define() quando precisar de uma constante criada condicionalmente ou com um nome dinâmico. Para aprofundar o conhecimento, continue com os capítulos sobre constantes PHP e constantes de classe.

Prática

Prática
Em PHP, quais das afirmações a seguir são verdadeiras sobre constantes?
Em PHP, quais das afirmações a seguir são verdadeiras sobre constantes?
Was this page helpful?