__get, __set, __isset, __unset
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 46 sur 91.
PHP fournit quatre méthodes magiques qui interceptent l'accès aux propriétés : __get(), __set(), __isset(), et __unset(). Celles-ci sont déclenchées lorsque vous essayez d'accéder à des propriétés qui n'existent pas ou qui sont inaccessibles.
La méthode __get() est appelée lors de la lecture d'une propriété inaccessible, tandis que __set() gère l'écriture dans l'une d'elles. Cela vous permet de créer des propriétés dynamiques ou d'ajouter de la logique lorsque les propriétés sont accédées :
<?php
class DynamicObject {
private array $data = [];
public function __get(string $name): mixed {
return $this->data[$name] ?? null;
}
public function __set(string $name, mixed $value): void {
$this->data[$name] = $value;
}
}
$obj = new DynamicObject();
$obj->title = "Hello";
$obj->count = 42;
echo $obj->title . " - " . $obj->count;
Sortie :
Hello - 42La méthode __isset() est déclenchée par isset() ou empty(), et __unset() répond à la fonction unset() :
<?php
class DynamicObject {
private array $data = [];
public function __set(string $name, mixed $value): void {
$this->data[$name] = $value;
}
public function __isset(string $name): bool {
return isset($this->data[$name]);
}
public function __unset(string $name): void {
unset($this->data[$name]);
}
}
$obj = new DynamicObject();
$obj->name = "Test";
echo isset($obj->name) ? "exists" : "missing";
Sortie :
existsCes méthodes sont couramment utilisées pour créer des conteneurs de données flexibles, implémenter le chargement différé ou construire des objets qui se comportent comme des tableaux tout en conservant une structure orientée objet.
Défi
FacileConstruisons un gestionnaire de configuration flexible qui stocke les paramètres de manière dynamique en utilisant des méthodes magiques. Votre classe interceptera l'accès aux propriétés pour gérer les valeurs de configuration, vérifier si les paramètres existent et les supprimer si nécessaire — tout cela sans définir explicitement chaque propriété.
Vous organiserez votre code sur deux fichiers :
Config.php— Créez une classeConfigqui utilise un tableau privé pour stocker les valeurs de configuration en interne. Implémentez les quatre méthodes magiques de propriété :__get($name)— Retourne la valeur pour la clé donnée, ou"undefined"si la clé n'existe pas__set($name, $value)— Stocke la valeur sous la clé donnée__isset($name)— Retourne si la clé existe dans la configuration__unset($name)— Supprime la clé de la configuration
count()qui retourne le nombre de paramètres stockés.main.php— Incluez le fichier Config. Vous recevrez trois entrées : un nom de paramètre, une valeur de paramètre et un deuxième nom de paramètre. Créez une instance deConfiget effectuez ces opérations :- Définissez le premier paramètre avec la valeur donnée
- Affichez si le premier paramètre existe en utilisant
isset()— affichez"exists"ou"missing" - Affichez la valeur du premier paramètre
- Affichez le nombre actuel de paramètres
- Utilisez
unset()pour supprimer le premier paramètre - Affichez si le premier paramètre existe maintenant — affichez
"exists"ou"missing" - Affichez la valeur du deuxième paramètre (qui n'a jamais été défini)
Chaque sortie doit être sur sa propre ligne. Les méthodes magiques vous permettent d'interagir avec votre objet Config en utilisant une syntaxe de propriété naturelle comme $config->theme = "dark" et isset($config->theme), même si aucune propriété réelle n'est définie.
Aide-mémoire
PHP fournit quatre méthodes magiques pour intercepter l'accès aux propriétés :
__get(string $name): mixed— Appelée lors de la lecture d'une propriété inaccessible__set(string $name, mixed $value): void— Appelée lors de l'écriture dans une propriété inaccessible__isset(string $name): bool— Déclenchée parisset()ouempty()__unset(string $name): void— Déclenchée parunset()
Exemple de __get() et __set() :
<?php
class DynamicObject {
private array $data = [];
public function __get(string $name): mixed {
return $this->data[$name] ?? null;
}
public function __set(string $name, mixed $value): void {
$this->data[$name] = $value;
}
}
$obj = new DynamicObject();
$obj->title = "Hello";
echo $obj->title; // Hello
Exemple de __isset() et __unset() :
<?php
class DynamicObject {
private array $data = [];
public function __set(string $name, mixed $value): void {
$this->data[$name] = $value;
}
public function __isset(string $name): bool {
return isset($this->data[$name]);
}
public function __unset(string $name): void {
unset($this->data[$name]);
}
}
$obj = new DynamicObject();
$obj->name = "Test";
echo isset($obj->name) ? "exists" : "missing"; // exists
Ces méthodes permettent d'utiliser des propriétés dynamiques, le chargement différé (lazy loading) et des conteneurs de données flexibles tout en maintenant une structure orientée objet.
Essayez vous-même
<?php
require_once 'Config.php';
// Lire les entrées
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));
// TODO: Créer une instance de Config
// TODO: Définir le premier paramètre avec la valeur donnée
// TODO: Afficher si le premier paramètre existe ("exists" ou "missing")
// TODO: Afficher la valeur du premier paramètre
// TODO: Afficher le nombre actuel de paramètres
// TODO: Utiliser unset() pour supprimer le premier paramètre
// TODO: Afficher si le premier paramètre existe maintenant ("exists" ou "missing")
// TODO: Afficher la valeur du second paramètre (qui n'a jamais été défini)
?>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