Constantes de Classe

É possível definir constantes em cada classe separadamente. A visibilidade padrão de constantes de classe é public.

Nota:

Constantes de classe podem ser redefinidas em classes filhas. A partir do PHP 8.1.0, constantes de classe não podem ser redefinidas numa classe filha se ela for qualificada como final.

Também é possível que interfaces tenham constantes. Veja na documentação de interface os exemplos.

É possível referenciar a classe usando uma variável. O valor da variável não pode ser uma palavra-chave (e.g. self, parent e static).

Constantes de classe são alocadas por classe, e não em cada instância da classe.

A partir do PHP 8.3.0, constantes de classe podem ter um tipo escalar tal como bool, int, float, string ou mesmo array. Ao usar array, seu conteúdo só pode ser de outros tipos escalares.

Exemplo #1 Definindo e usando uma constante

<?php
class MinhaClasse
{
const
CONSTANTE = 'valor constante';

function
mostrarConstante() {
echo
self::CONSTANTE . "\n";
}
}

echo
MinhaClasse::CONSTANTE . "\n";

$classname = "MinhaClasse";
echo
$classname::CONSTANTE;

$classe = new MinhaClasse();
$classe->mostrarConstante();

echo
$classe::CONSTANTE;
?>

A constante especial ::class permite a resolução de classes pelo seu nome completo em tempo de compilação, e isso é útil em classes com namespaces:

Exemplo #2 Exemplo com informação estática

<?php
namespace foo {
class
bar {
}

echo
bar::class; // foo\bar
}
?>

Exemplo #3 Exemplo de expressão constante

<?php
const UM = 1;
class
foo {
const
DOIS = UM * 2;
const
TRES = UM + self::DOIS;
const
FRASE = 'O valor de TRES é '.self::TRES;
}
?>

Exemplo #4 Modificadores de visibilidade em constantes de classe

<?php
class Foo {
public const
BAR = 'bar';
private const
BAZ = 'baz';
}
echo
Foo::BAR, PHP_EOL;
echo
Foo::BAZ, PHP_EOL;
?>

Saída do exemplo acima no PHP 7.1:

bar

Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …

Nota:

Modificadores de visibilidade estão disponíveis desde o PHP 7.1.0.

Exemplo #5 Verificando variância de visibilidade de constantes de classe, a partir do PHP 8.3.0

<?php

interface MyInterface
{
public const
VALUE = 42;
}

class
MyClass implements MyInterface
{
protected const
VALUE = 42;
}
?>

Saída do exemplo acima no PHP 8.3:

Fatal error: Access level to MyClass::VALUE must be public (as in interface MyInterface) …

Nota: A partir do PHP 8.3.0, a variância de visibilidade é verificada mais estritamente. Antes desta versão, a visibilidade de uma constante de classe poderia ser diferente da visibilidade da constante na interface implementada.

Exemplo #6 Sintaxe de busca de constante de classe, a partir do PHP 8.3.0

<?php
class Foo {
public const
BAR = 'bar';
private const
BAZ = 'baz';
}

$name = 'BAR';
echo
Foo::{$name}, PHP_EOL; // bar
?>

Nota:

A partir do PHP 8.3.0, constantes de classe podem ser buscadas dinamicamente usando uma variável.

Exemplo #7 Atribuindo tipos a constantes de classe, a partir do PHP 8.3.0

<?php

class MyClass {
public const
bool MY_BOOL = true;
public const
int MY_INT = 1;
public const
float MY_FLOAT = 1.01;
public const
string MY_STRING = 'one';
public const array
MY_ARRAY = [self::MY_BOOL, self::MY_INT, self::MY_FLOAT, self::MY_STRING];
}

var_dump(MyClass::MY_BOOL);
var_dump(MyClass::MY_INT);
var_dump(MyClass::MY_FLOAT);
var_dump(MyClass::MY_STRING);
var_dump(MyClass::MY_ARRAY);
?>

Saída do exemplo acima no PHP 8.3:

bool(true)
int(1)
float(1.01)
string(3) "one"
array(4) {
  [0]=>
  bool(true)
  [1]=>
  int(1)
  [2]=>
  float(1.01)
  [3]=>
  string(3) "one"
}