Menu
Coddy logo textTech

__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 - 42

La 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 :

exists

Ces 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.

challenge icon

Défi

Facile

Construisons 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 classe Config qui 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
    Ajoutez également une méthode 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 de Config et 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 par isset() ou empty()
  • __unset(string $name): void — Déclenchée par unset()

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)

?>
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