Nous avons vu précédemment que les attributs et méthodes définis dans une classe appartiennent en fait à l'objet qui sera l'instance de cette classe. On s'est donc servi de l'opérateur -> pour désigner un membre à partir de l'objet créé.
Cependant, ont peut spécifier les membres qui appartiennent à la classe et non à l'objet. On appelle ces membres, attributs et méthodes statiques. Pour y accéder on se sert de l'opérateur de résolution statique :: appelé simplement double deux points.
Membres statiques d'une classe: constantes de classe, attributs et méthodes statiques
Constantes de classe
Une constante de classe est un élément statique par défaut. Son rôle est le même que celui d'une constante classique déclarée à l'aide de la fonction define(). Sa valeur est inchangée et elle appartient à la classe dans laquelle est elle évoquée et non à l'objet qui constitue l'instance de classe.
Pour définir une constante on utilise le mot clé const suivi du nom de la constante à laquelle on affecte la valeur souhaitée. Par convention l'identifiant de la constante est déclaré en majuscule.
Exemple:
<?php
class Voiture{
const ROUES=4;
private $couleur="Rouge";
private $puissance;
private $vitesse;
public function accelerer(){
echo "Appel de la méthode accelerer()";
}
public function ralentir(){
echo "Appel de la méthode ralentir()";
}
}
?>
La constante de classe peut être appelée de l'intérieur comme de l'extérieur de la classe grâce à l'opérateur de résolution de portée ::.
Si par exemple on exécute le code suivant après la définition de la classe Voiture:
<?php
echo "Nombre de roues: ".Voiture::ROUES;
?>
on obtient:
Nombre de roues: 4
Attributs et méthodes statiques
Les attributs et méthodes statiques appartiennent à la classe et non à l'objet. Par conséquent on ne peut pas y accéder par l'opérateur -> mais plutôt par l'opérateur de résolution de portée :: précédé par le nom de la classe dans laquelle ils sont définis.
Pour spécifier si un membre est statique on déclare le mot clé static après la visibilité. Par exemple:
<?php
class Voiture{
private static $roues=4;
public static function message(){
echo "Il s'agit d'une voiture.<br />";
echo "Elle a ".Voiture::$roues." roues.";
}
}
Voiture::message();
?>
Donne:
Il s'agit d'une voiture.
Elle a 4 roues.
Lors d'un appel statique d'un attribut, celui-ci conserve le dollars.
Vous avez remarqué que nous avons appelé lé méthode statique message() de l'extérieur de la classe, il est dont évident de déclarer le nom de la classe (Voiture) avant l'opérateur de résolution de portée. En revanche, l'attribut statique $roues a été appelé de l'intérieur de la classe. Là aussi on a mis le nom de la classe avant l'opérateur de résolution de portée. Néanmoins, on aurait pu mettre le mot clé self qui désigne la classe courante.
L'exemple précédent peut donc devenir:
<?php
class Voiture{
private static $roues=4;
public static function message(){
echo "Il s'agit d'une voiture.<br />";
echo "Elle a ".self::$roues." roues.";
}
}
Voiture::message();
?>
Généralement, si on veut faire un appel statique (d'une constante, attribut ou méthode) à l'intérieur de la classe, il est préférable de mettre le mot clé self au lieu du nom de la classe elle même. Par contre, à l'extérieur de la classe il faut mettre le nom de celle ci avant l'opérateur de résolution de portée.