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.
Défi
FacileConstruisons 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 classeVisitorqui 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é$totalVisitorsdoit ê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éthodegetInfo()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 utilisantVisitor::$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
?>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
1Les bases de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition de méthodeLe mot-clé finalClasses abstraitesRécapitulatif - Hiérarchie des employés7Encapsulation
Public, Protégé, PrivéModificateurs d'accès en détailGetters et SettersMasquage d'informationPromotion de constructeur (8.0)Récapitulatif - Système de gestion d'étudiants10Concepts avancés de la POO
Composition vs HéritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibers (PHP 8.1)Clonage d'objets : analyse approfondieGénérateurs et Itérateurs13Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository2Espaces de noms et Autoloading
Introduction aux espaces de nomsLe mot-clé useStandard d'Autoloading PSR-4L'Autoloader ComposerRécapitulatif - Projet organisé5Interfaces et Contrats
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesInterface vs Classe AbstraiteType Hinting avec les InterfacesRécapitulatif - Calculateur de Formes8Méthodes magiques
Introduction aux méthodes magiques__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Clonage d'objets__serialize & __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d'instance vs Propriétés statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés readonly (PHP 8.1)Récapitulatif - Gestionnaire de compte bancaire6Polymorphisme
Retour sur la redéfinition de méthodePolymorphisme via les interfacesType Hinting et Types d'unionLiaison statique tardiveRécapitulatif - Processeur de paiement9Traits
Introduction aux TraitsUtilisation de plusieurs TraitsRésolution des conflits de TraitsMéthodes abstraites dans les TraitsTraits vs Héritage12Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie