10- Les classes statiques

Une classe statique est une classe qui ne peut pas être instanciée : on accède directement aux attributs et méthodes de la classe sans pour autant instancier d'objet.

En PHP, les classes statiques à proprement parler n'existent pas, mais le fait de pouvoir déclarer des méthodes et attributs statiques simulent cette carence.

Pour déclarer une méthode ou un attribut statique, il suffit d'utiliser le mot-clé static. Par définition, on ne peut utiliser une méthode ou un attribut statique sur un objet puisque la classe n'a pas à être instanciée : on l'utilise donc directement sur la classe avec l'opérateur d'appartenance statique ::.

Exemple d'utilisation de méthode et attribut statiques :

class Usine{
    public static $compteurVoitureConstruite = 0;
    public static $compteurVoitureDetruite = 0;

    public static function ajouterVoitureConstruite(){
        self::$compteurVoitureConstruite++;
    }

    public static function ajouterVoitureDetruite(){
        self::$compteurVoitureDetruite++;
    }
}

class Voiture{
    public function __construct()
    {
        Usine::ajouterVoitureConstruite();
    }

    public function __destruct()
    {
        Usine::ajouterVoitureDetruite();
    }
}

$voiture1 = new Voiture();
$voiture2 = new Voiture();

unset($voiture1);

var_dump(Usine::$compteurVoitureConstruite); // écrit int(2)
var_dump(Usine::$compteurVoitureDetruite); // écrit int(1)

Dans cet exemple, nous avons une classe Usine qui a un compteur statique du nombre de voiture, et une méthode statique qui permet d'ajouter une unité à ce compteur. En outre, dans le constructeur de la classe Voiture, nous utilisons cette méthode pour incrémenter le nombre de voiture à chaque fois que l'on construit une voiture. On peut alors accéder à ce compteur de n'importe où pour voir combien de voitures ont été créées.

En outre, nous avons utilisé le destructeur (__destruct()) de la classe (qui est appelé lorsque l'objet est détruit, ici unset()), pour incrémenter un autre compteur de voitures détruites encore une fois en appelant une méthode statique de notre Usine.

Notez que pour accéder aux attributs et méthodes statiques à partir de l'intérieur de la classe, il faut utiliser le mot-clé self.