Constantes de classe
La programmation orientée objet en PHP : Constantes de classe
Constantes de classe
L'opérateur de résolution de portée (::), appelé double deux points (Scope Resolution Operator en anglais ou Paamayim Nekudotayim en hébreu), est utilisé pour appeler des éléments appartenant à une classe comme les constantes de classe, sortes d'attributs dont la valeur est constante, c'est-à-dire qu'elle ne change pas.Les constantes de classe permettent d'éviter tout code muet. Voici un code muet :
<?php
$perso = new Personnage(50);
Pourquoi est-il muet ? Tout simplement parce qu'on ne sait pas à quoi 50 correspond. Qu'est-ce que cela veut dire ? Étant donné que je viens de réaliser le script, je sais que ce 50 correspond à la force du personnage.
Imaginez que ce paramètre ne peut prendre que 3 valeurs possibles :
- 20, qui veut dire que le personnage aura une faible force ;
- 50, qui veut dire que le personnage aura une force moyenne ;
- 80, qui veut dire que le personnage sera très fort
<?php
class Personnage {
private $_force;
private $_experience;
private $_degats;
// Déclarations des constantes en rapport avec la force
const FORCE_PETITE = 20;
const FORCE_MOYENNE = 50;
const FORCE_GRANDE = 80;
public function __construct() {
}
public function deplacer() {
}
public function frapper() {
}
public function gagnerExperience() {
}
// ...
}
L'opérateur de résolution de portée
Contrairement aux attributs, vous ne pouvez accéder à ces valeurs via l'opérateur -> depuis un objet (ni $this ni $perso ne fonctionneront) mais avec l'opérateur :: car une constante appartient à la classe et non à un quelconque objet.<?php
class Personnage {
private $_force;
private $_experience;
private $_degats;
// Déclarations des constantes en rapport avec la force
const FORCE_PETITE = 20;
const FORCE_MOYENNE = 50;
const FORCE_GRANDE = 80;
public function __construct($forceInitiale) {
// N'oubliez pas qu'il faut assigner la valeur d'un attribut uniquement depuis son setter !
$this->setForce($forceInitiale);
}
public function deplacer() {
}
public function frapper() {
}
public function gagnerExperience() {
}
public function setForce($force) {
// On vérifie qu'on nous donne bien soit une FORCE_PETITE, soit une FORCE_MOYENNE, soit une FORCE_GRANDE.
if (in_array($force, [self::FORCE_PETITE, self::FORCE_MOYENNE, self::FORCE_GRANDE]))
{
$this->_force = $force;
}
}
}
// On envoie une FORCE_MOYENNE en guise de force initiale.
$perso = new Personnage(Personnage::FORCE_MOYENNE);