Aller au contenu principal

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

astuce
  • 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


Qu'est-ce qu'une constante de classe en PHP ?


Comment déclarez-vous une constante de classe en PHP ?


Comment accédez-vous à une constante de classe en PHP ?


Qu'arrive-t-il si vous essayez de modifier une constante de classe en PHP ?


Où pouvez-vous accéder à une constante de classe en PHP ?



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éthode afficherForceMax() (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éthode afficherForcesMax() (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.

attention

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.

remarque

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 constante FORCE_MAX qui est utilisée est celle de la classe où la méthode est définie (classe Personnage).
  • avec static:: la constante FORCE_MAX qui est utilisée est celle de la classe qui a appelé la méthode (classe Guerrier ou Magicien ou Archer).
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.

attention

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.