Menu
Coddy logo textTech

Propriétés d'instance vs Propriétés 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 définies par défaut. Chaque objet possède 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 vous 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 comment $count est partagé entre toutes les instances. Chaque fois que nous créons un nouvel User, la même variable $count s'incrémente. À l'intérieur de la classe, nous utilisons self::$count pour référencer 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 avez besoin de partager des données entre tous les objets d'une classe, comme pour compter les instances ou stocker une configuration.

challenge icon

Défi

Facile

Construisons un système de suivi des visiteurs qui démontre la différence entre les propriétés d'instance (uniques à chaque visiteur) et les propriétés statiques (partagées par 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 maintient un décompte total des visiteurs. Chaque visiteur doit avoir sa propre propriété $name (propriété d'instance), tandis qu'une propriété $totalVisitors doit être partagée entre toutes les instances (propriété statique). Le constructeur accepte un nom, le définit et incrémente le nombre total de visiteurs. Ajoutez une méthode getInfo() qui retourne "[name] is visitor #[totalVisitors]".
  • main.php — Incluez le fichier de la classe Visitor, puis créez trois visiteurs avec les noms "Alice", "Bob", et "Charlie" (dans cet ordre). Après avoir créé les trois, 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 à la propriété statique directement depuis la classe en utilisant Visitor::$totalVisitors.

Rappelez-vous qu'à l'intérieur de la classe, vous accédez aux propriétés statiques en utilisant 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 devrait afficher chaque visiteur avec son numéro attribué, suivi du décompte total final sur la dernière ligne.

Aide-mémoire

Les propriétés d'instance appartiennent à chaque objet individuel, tandis que les propriétés statiques appartiennent à la classe elle-même et sont partagées entre toutes les instances.

Propriétés d'instance :

Chaque objet reçoit sa propre copie de la propriété :

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

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

echo $alice->name; // Alice
echo $bob->name;   // Bob

Propriétés statiques :

Déclarées avec le mot-clé static et partagées entre toutes les instances :

<?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; // 2

Accès aux propriétés statiques :

  • À l'intérieur de la classe : self::$propertyName
  • À l'extérieur de la classe : ClassName::$propertyName

Accès aux propriétés d'instance :

  • À l'intérieur de la classe : $this->propertyName
  • À l'extérieur de la classe : $object->propertyName

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