W3docs

Comprendre les propriétés statiques en PHP OOP

Découvrez les propriétés statiques en PHP : déclaration, accès, héritage, différence entre self::, static:: et parent::, et cas d'usage courants.

Une propriété statique appartient à la classe elle-même plutôt qu'à un objet particulier créé à partir d'elle. Alors qu'une propriété ordinaire (d'instance) possède sa propre copie dans chaque objet, une propriété statique n'existe qu'une seule fois et est partagée par toutes les instances — modifiez-la à un endroit et toutes les instances voient la nouvelle valeur. Cette page explique comment déclarer des propriétés statiques, comment les lire et les écrire, comment self, static et parent diffèrent, comment elles se comportent avec l'héritage, et les pièges à éviter.

Si vous débutez avec les classes PHP, commencez par les classes et objets PHP.

Qu'est-ce qu'une propriété statique ?

Vous déclarez une propriété statique avec le mot-clé static, combiné à un modificateur de visibilité (public, protected ou private) :

<?php

class User {
    public static int $count = 0;

    public function __construct() {
        self::$count++;
    }
}

new User();
new User();
new User();

echo User::$count; // 3

Trois caractéristiques distinguent une propriété statique d'une propriété ordinaire :

  • Accès via la classe, pas un objet. On écrit User::$count avec l'opérateur de résolution de portée ::, et non $user->count. Tenter de lire une propriété statique via l'opérateur flèche ($user->count) ne fonctionne pas et génère une notice.
  • Partagée, non copiée. Chaque new User() incrémente le même $count. Il n'existe qu'une seule copie en mémoire pour toute la classe.
  • Référencée comme self::$count à l'intérieur de la classe. Dans une méthode, on accède à la propriété via self::, static:: ou parent:: — jamais avec $this.

Lire et écrire une propriété statique

Depuis l'intérieur de la classe, utilisez self::$property. Depuis l'extérieur, utilisez NomDeClasse::$property. Comme il n'existe qu'une seule copie, une écriture depuis n'importe quel contexte est visible partout :

<?php

class Counter {
    public static int $value = 0;

    public static function increment(): void {
        self::$value++;
    }
}

Counter::increment();
Counter::increment();
Counter::$value += 10; // also writable directly from outside

echo Counter::$value; // 12

Une propriété statique peut avoir une valeur par défaut, mais cette valeur doit être une expression constante (un littéral, une constante, ou une expression arithmétique const simple) — elle ne peut pas être le résultat d'un appel de fonction ou d'un objet new.

self:: vs static:: (liaison statique tardive)

À l'intérieur d'une méthode, vous pouvez accéder à une propriété statique avec self:: ou static::. Ils diffèrent lorsque l'héritage est impliqué :

  • self:: est résolu à la compilation et pointe toujours vers la classe où le code est écrit.
  • static:: utilise la liaison statique tardive — il pointe vers la classe sur laquelle la méthode a été appelée à l'exécution.
<?php

class Base {
    public static string $label = "Base";

    public static function whoAmISelf(): string {
        return self::$label;   // bound to Base
    }

    public static function whoAmIStatic(): string {
        return static::$label; // bound to the calling class
    }
}

class Child extends Base {
    public static string $label = "Child";
}

echo Child::whoAmISelf();  // Base
echo "\n";
echo Child::whoAmIStatic(); // Child

Utilisez static:: lorsque vous souhaitez que les sous-classes puissent remplacer la valeur ; utilisez self:: lorsque la valeur doit rester liée à la classe qui la déclare. Consultez les méthodes statiques PHP pour en savoir plus sur l'appel des membres statiques.

Quand utiliser les propriétés statiques ?

Les propriétés statiques sont particulièrement utiles lorsqu'un état doit être partagé entre toutes les instances d'une classe :

  • Compter les instances — l'exemple User::$count ci-dessus suit le nombre d'objets existants.
  • Cache / registres — stocker une table de correspondance ou une ressource partagée unique (par ex. un handle de connexion à une base de données) pour qu'elle soit créée une seule fois et réutilisée.
  • Configuration ou indicateurs — une valeur par défaut qui s'applique à toute la classe, comme un User::$defaultRole global.
  • Le patron Singleton — une propriété statique privée contient l'unique instance retournée par getInstance().

Si la valeur ne doit jamais changer après la déclaration, préférez une constante de classe (const) — elle exprime mieux l'intention et ne peut pas être réassignée.

Pièges courants

  • Les propriétés statiques ne sont pas des constantes. Elles sont mutables ; tout code ayant accès peut les réassigner. Utilisez const pour les valeurs qui ne doivent pas changer.
  • L'état partagé est une arme à double tranchant. Comme toutes les instances partagent la valeur, une modification dans un objet est visible partout — pratique pour les compteurs, dangereux si vous attendiez des données par objet.
  • Pas de $this dans un contexte statique. Les méthodes statiques n'ont pas de $this, donc une propriété statique doit être accédée avec self::, static:: ou parent::.
  • L'héritage partage le stockage du parent sauf si redéclarée. Une sous-classe qui ne redéclare pas une propriété statique partage la copie unique du parent ; la redéclarer (comme Child le fait ci-dessus) donne à la sous-classe sa propre copie.

Conclusion

Les propriétés statiques permettent à une classe de conserver un état partagé par toutes ses instances, accessible via le nom de la classe avec l'opérateur :: et via self::/static:: à l'intérieur de la classe. Elles sont idéales pour les compteurs, les caches, les registres et les singletons. Utilisez une const de classe lorsque la valeur doit rester fixe, et n'oubliez pas que static:: active la liaison statique tardive pour que les sous-classes puissent remplacer la valeur. Explorez ensuite les méthodes statiques PHP et l'héritage PHP pour voir comment ces éléments s'articulent.

Pratique

Pratique
Qu'est-ce qui est correct concernant les propriétés statiques PHP selon le contenu de l'URL spécifiée ?
Qu'est-ce qui est correct concernant les propriétés statiques PHP selon le contenu de l'URL spécifiée ?
Was this page helpful?