Menu
Coddy logo textTech

Propriétés d’instance vs statiques

Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 15 sur 91.

Lorsque vous créez une propriété dans une classe, vous devez décider si elle appartient à chaque objet individuel ou à la classe elle-même. Cette distinction correspond à la différence entre les propriétés d’instance et les propriétés statiques.

Les propriétés d’instance sont celles utilisées par défaut. Chaque objet obtient sa propre copie de la propriété, et la modifier dans un objet n’affecte pas les autres :

<?php
class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo $alice->name . "\n";
echo $bob->name . "\n";

Sortie :

Alice
Bob

Les propriétés statiques appartiennent à la classe, et non à un objet spécifique. Vous les déclarez avec le mot-clé static et y accédez en utilisant le nom de la classe avec :: au lieu d’un objet avec -> :

<?php
class User {
    public static $count = 0;
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
        self::$count++;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo User::$count;

Sortie :

2

Remarquez que $count est partagé entre toutes les instances. Chaque fois que nous créons un nouvel User, la même variable $count est incrémentée. À l’intérieur de la classe, nous utilisons self::$count pour faire référence à la propriété statique.

Point clé : Utilisez des propriétés d’instance lorsque chaque objet a besoin de sa propre valeur. Utilisez des propriétés statiques lorsque vous devez partager des données entre tous les objets d’une classe, par exemple pour compter les instances ou stocker la configuration.

challenge icon

Défi

Facile

Construisons un système de suivi des visiteurs qui illustre la différence entre les propriétés d’instance (uniques à chaque visiteur) et les propriétés statiques (partagées entre tous les visiteurs).

Vous allez créer deux fichiers pour organiser votre code :

  • Visitor.php : définissez une classe Visitor qui suit les visiteurs individuels et conserve un décompte cumulatif du nombre total de visiteurs. Chaque visiteur doit avoir sa propre propriété $name (propriété d’instance), tandis qu’une propriété $totalVisitors doit être partagée par toutes les instances (propriété statique). Le constructeur accepte un nom, l’affecte à la propriété et incrémente le nombre total de visiteurs. Ajoutez une méthode getInfo() qui renvoie "[name] is visitor #[totalVisitors]".
  • main.php : incluez le fichier de la classe Visitor, puis créez trois visiteurs portant les noms "Alice", "Bob" et "Charlie" (dans cet ordre). Après avoir créé les trois visiteurs, affichez le résultat de l’appel à getInfo() pour chaque visiteur (chacun sur sa propre ligne), puis affichez le nombre total de visiteurs en accédant directement à la propriété statique depuis la classe à l’aide de Visitor::$totalVisitors.

N’oubliez pas qu’à l’intérieur de la classe, vous accédez aux propriétés statiques à l’aide de self::$propertyName, tandis qu’à l’extérieur de la classe, vous utilisez ClassName::$propertyName. Les propriétés d’instance sont accessibles avec $this->propertyName, comme d’habitude.

Votre sortie doit afficher chaque visiteur avec le numéro qui lui a été attribué, suivi du nombre total final sur la dernière ligne.

Essayez vous-même

<?php
// Inclure la classe Visitor
require_once 'Visitor.php';

// TODO : Créer trois visiteurs avec les noms "Alice", "Bob" et "Charlie" (dans cet ordre)

// TODO : Afficher le résultat de getInfo() pour chaque visiteur (chacun sur sa propre ligne)

// TODO : Afficher le nombre total de visiteurs en utilisant Visitor::$totalVisitors
?>
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur PHP en ligne