Constantes de clase
Es posible definir constantes
por clases que permanecen idénticas y no modificables.
La visibilidad por omisión de las constantes de clase es public
.
Nota:
Las constantes de clases pueden ser redefinidas por una clase hija.
A partir de PHP 8.1.0, las constantes de clases no pueden ser
redefinidas por una clase hija si ha sido definida como
final.
También es posible para las interfaces tener constantes.
Ver la documentación de las interfaces
para ejemplos.
Es posible referenciar la clase utilizando una variable.
El valor de la variable no puede ser una palabra clave (por ejemplo, self
,
parent
y static
).
Tenga en cuenta que las constantes de clase son asignadas una vez por clase, y no
para cada instancia de clase.
A partir de PHP 8.3.0, las constantes de clase pueden tener un tipo escalar como
bool
, int
, float
, string
,
o incluso array
. Al utilizar array
, su contenido
solo puede contener otros tipos escalares.
Ejemplo #1 Definición y uso de una constante de clase
<?php
class MyClass
{
const CONSTANT = 'valor constante';
function showConstant() {
echo self::CONSTANT . "\n";
}
}
echo MyClass::CONSTANT . "\n";
$classname = "MyClass";
echo $classname::CONSTANT . "\n";
$class = new MyClass();
$class->showConstant();
echo $class::CONSTANT."\n";
?>
La constante especial ::class
permite
una resolución de nombre de clase completamente cualificado en el momento de la compilación,
esto es útil para las clases en un espacio de nombres:
Ejemplo #2 Ejemplo de uso de ::class
<?php
namespace foo {
class bar {
}
echo bar::class; // foo\bar
}
?>
Ejemplo #3 Ejemplo de expresiones para una constante de clase
<?php
const ONE = 1;
class foo {
const TWO = ONE * 2;
const THREE = ONE + self::TWO;
const SENTENCE = 'El valor de THREE es '.self::THREE;
}
?>
Ejemplo #4 Modificador de visibilidad de las constantes de clase, a partir de PHP 7.1
<?php
class Foo {
public const BAR = 'bar';
private const BAZ = 'baz';
}
echo Foo::BAR, PHP_EOL;
echo Foo::BAZ, PHP_EOL;
?>
Salida del ejemplo anterior en PHP 7.1:
bar
Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …
Nota:
A partir de PHP 7.1.0, los modificadores de visibilidad son permitidos
en las constantes de clase.
Ejemplo #5 Verificación de varianza de visibilidad de las constantes de clase, a partir de PHP 8.3.0
<?php
interface MyInterface
{
public const VALUE = 42;
}
class MyClass implements MyInterface
{
protected const VALUE = 42;
}
?>
Salida del ejemplo anterior en PHP 8.3:
Fatal error: Access level to MyClass::VALUE must be public (as in interface MyInterface) …
Nota:
A partir de PHP 8.3.0, la varianza de visibilidad es verificada de manera más estricta.
Antes de esta versión, la visibilidad de una constante de clase podía diferir de la de la constante
en la interfaz implementada.
Ejemplo #6 Sintaxis de acceso dinámico a las constantes de clase, a partir de 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 de PHP 8.3.0, las constantes de clase pueden ser recuperadas dinámicamente utilizando una
variable.
Ejemplo #7 Asignación de tipos a las constantes de clase, a partir de 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);
?>
Salida del ejemplo anterior en 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"
}