Constantes de classe
Il est possible de définir des constantes
par classes qui restent identiques et non modifiables.
La visibilité par défaut des constantes de classe est public
.
Note:
Les constantes de classes peuvent être redéfinies par une classe enfant.
À partir de PHP 8.1.0, les constantes de classes ne peuvent pas être
redéfinies par une classe enfant si elle a été défini comme
finale.
Il est aussi possible pour les interfaces d'avoir des constantes.
Voir la documentation des interfaces
pour des exemples.
Il est possible de référencer la classe en utilisant une variable.
La valeur de la variable ne peut pas être un mot-clé (e.g. self
,
parent
et static
).
Notez que les constantes de classe sont allouées une fois par classe, et non
pour chaque instance de classe.
À partir de PHP 8.3.0, les constantes de classe peuvent avoir un type scalaire tel que
bool
, int
, float
, string
,
ou même array
. Lorsqu’on utilise array
, son contenu
ne peut contenir que d'autres types scalaires.
Exemple #1 Définition et utilisation d'une constante de classe
<?php
class MyClass
{
const CONSTANT = 'valeur 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 spéciale ::class
permet
une résolution de nom de classe pleinement qualifié au moment de la compilation,
cela est utile pour les classes dans un espace de nom :
Exemple #2 Exemple d'utilisation de ::class
<?php
namespace foo {
class bar {
}
echo bar::class; // foo\bar
}
?>
Exemple #3 Exemple d'expressions pour une constante de classe
<?php
const ONE = 1;
class foo {
const TWO = ONE * 2;
const THREE = ONE + self::TWO;
const SENTENCE = 'The value of THREE is '.self::THREE;
}
?>
Exemple #4 Modificateur de visibilité des constantes de classe, à 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;
?>
Résultat de l'exemple ci-dessus en PHP 7.1 :
bar
Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …
Note:
À partir de PHP 7.1.0, les modificateurs de visibilité sont autorisés
sur les constantes de classe.
Exemple #5 Vérification de variance de visibilité des constantes de classe, à partir de PHP 8.3.0
<?php
interface MyInterface
{
public const VALUE = 42;
}
class MyClass implements MyInterface
{
protected const VALUE = 42;
}
?>
Résultat de l'exemple ci-dessus en PHP 8.3 :
Fatal error: Access level to MyClass::VALUE must be public (as in interface MyInterface) …
Note:
À partir de PHP 8.3.0, la variance de visibilité est vérifiée de manière plus stricte.
Avant cette version, la visibilité d'une constante de classe pouvait différer de celle de la constante
dans l'interface implémentée.
Exemple #6 Syntaxe d'accès dynamique aux constantes de classe, à 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
?>
Note:
À partir de PHP 8.3.0, les constantes de classe peuvent être récupérées dynamiquement en utilisant une
variable.
Exemple #7 Attribution de types aux constantes de classe, à 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);
?>
Résultat de l'exemple ci-dessus 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"
}