Constantes de classe
Notions théoriques
En PHP, une constante de classe est une valeur qui ne change pas (après avoir été définie dans une classe).
Les constantes de classe sont déclarées à l'intérieur d'une classe avec le mot-clé const
.
Une fois définies, elles ne peuvent pas être modifiées.
Elles sont accessibles de partout, à l'intérieur comme à l'extérieur de la classe, et peuvent être utilisées sans instancier la classe.
Pour accéder à une constante de classe, nous utilisons l'opérateur de résolution de portée ::
(comme pour les propriétés et méthodes statiques).
Par exemple, vous pouvez consulter les constantes de la classe PDO : https://www.php.net/manual/fr/pdo.constants.php
-
Les constantes sont sensibles à la casse.
-
Par convention, les constantes sont toujours en majuscule.
Exemple pratique
Prenons l'exemple de notre jeu de combat.
Supposons que nous ayons une classe Guerrier
et que chaque guerrier a une force maximale.
Cette force maximale est la même pour tous les guerriers, donc nous pouvons la définir comme une constante de classe.
class Guerrier {
const FORCE_MAX = 100;
public function afficherForceMax() {
print(self::FORCE_MAX);
}
}
$guerrier = new Guerrier();
$guerrier->afficherForceMax(); // Affiche 100
print(Guerrier::FORCE_MAX); // Affiche 100
Dans cet exemple, FORCE_MAX
est une constante de classe.
Nous pouvons y accéder :
- dans une méthode de la classe en utilisant
self::FORCE_MAX
, - ou directement à partir de la classe en utilisant
Guerrier::FORCE_MAX
.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Dans notre jeu de combat, chaque type de personnage a une force maximale différente.
-
Votre tâche est de définir une constante de classe pour la force maximale dans une classe abstraite
Personnage
. -
Créez une méthode dans la classe abstraite
Personnage
qui affiche la force maximale (quelque soit le type de personnage) à l'aide de la méthodeafficherForceMax()
(sans s à Force). -
Ensuite, chaque classe de personnage (
Guerrier
,Magicien
,Archer
) héritera de cette classe abstraite et définira sa propre valeur pour la force maximale. -
Ensuite, créez une classe
Jeu
avec une méthodeafficherForcesMax()
(avec un s à Forces) qui affiche la force maximale de tous les personnages (quelques soient leur types):
class Jeu {
public static function afficherForcesMax() {
print("Guerrier - ");
Guerrier::afficherForceMax();
print("Magicien - ");
Magicien::afficherForceMax();
print("Archer - ");
Archer::afficherForceMax();
}
}
Jeu::afficherForcesMax();
Corrigé du TP (version avec self::
)
Code du fichier Personnage.php
:
abstract class Personnage {
const FORCE_MAX = 0;
public static function afficherForceMax() {
print("Force max : " . static::FORCE_MAX . "\n");
}
}
Code du fichier Guerrier.php
:
class Guerrier extends Personnage {
const FORCE_MAX = 100;
}
Code du fichier Magicien.php
:
class Magicien extends Personnage {
const FORCE_MAX = 80;
}
Code du fichier Archer.php
:
class Archer extends Personnage {
const FORCE_MAX = 60;
}
Code du fichier Jeu.php
:
class Jeu {
public static function afficherForcesMax() {
print("Guerrier - ");
Guerrier::afficherForceMax();
print("Magicien - ");
Magicien::afficherForceMax();
print("Archer - ");
Archer::afficherForceMax();
}
}
Jeu::afficherForcesMax();
Dans ce code, la classe abstraite Personnage
définit une constante FORCE_MAX
.
Chaque classe de personnage (Guerrier
, Magicien
, Archer
) hérite de Personnage
et définit sa propre valeur pour FORCE_MAX
.
La méthode afficherForceMax()
de la classe Personnage
est utilisée pour afficher la force maximale de chaque type de personnage.
La méthode afficherForcesMax()
de la classe Jeu
appelle ensuite afficherForceMax()
pour chaque type de personnage.
Notez l'utilisation de static::
au lieu de self::
dans la méthode afficherForceMax()
. C'est ce qu'on appelle une liaison tardive statique.
Cela signifie que la constante FORCE_MAX
qui est utilisée est celle de la classe qui a appelé la méthode, et non celle de la classe où la méthode est définie.
Il est possible d'utiliser static::
au lieu de self::
dans la méthode afficherForceMax()
.
C'est ce qu'on appelle une liaison tardive statique.
- avec
self::
la constanteFORCE_MAX
qui est utilisée est celle de la classe où la méthode est définie (classePersonnage
). - avec
static::
la constanteFORCE_MAX
qui est utilisée est celle de la classe qui a appelé la méthode (classeGuerrier
ouMagicien
ouArcher
).
Corrigé du TP (version avec static::
)
Code du fichier Personnage.php
:
abstract class Personnage {
const FORCE_MAX = 0;
public static function afficherForceMax() {
print("Force max : " . static::FORCE_MAX . "\n");
}
}
Code du fichier Guerrier.php
:
class Guerrier extends Personnage {
const FORCE_MAX = 100;
}
Code du fichier Magicien.php
:
class Magicien extends Personnage {
const FORCE_MAX = 80;
}
Code du fichier Archer.php
:
class Archer extends Personnage {
const FORCE_MAX = 60;
}
Code du fichier Jeu.php
:
class Jeu {
public static function afficherForcesMax() {
print("Guerrier - ");
Guerrier::afficherForceMax();
print("Magicien - ");
Magicien::afficherForceMax();
print("Archer - ");
Archer::afficherForceMax();
}
}
Jeu::afficherForcesMax();
Dans ce code, la classe abstraite Personnage
définit une constante FORCE_MAX
.
Chaque classe de personnage (Guerrier
, Magicien
, Archer
) hérite de Personnage
et définit sa propre valeur pour FORCE_MAX
.
La méthode afficherForceMax()
de la classe Personnage
est utilisée pour afficher la force maximale de chaque type de personnage.
La méthode afficherForcesMax()
de la classe Jeu
appelle ensuite afficherForceMax()
pour chaque type de personnage.
Notez l'utilisation de static::
au lieu de self::
dans la méthode afficherForceMax()
. C'est ce qu'on appelle une liaison tardive statique.
Cela signifie que la constante FORCE_MAX
qui est utilisée est celle de la classe qui a appelé la méthode, et non celle de la classe où la méthode est définie.