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(). Elles 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 d’une telle propriété. Cela vous permet de créer des propriétés dynamiques ou d’ajouter une logique lorsque les propriétés sont consulté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 créer 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 dynamiquement les paramètres à l’aide de méthodes magiques. Votre classe interceptera l’accès aux propriétés pour gérer les valeurs de configuration, vérifier si des paramètres existent et les supprimer lorsque nécessaire, le tout sans définir explicitement chaque propriété.

Vous organiserez votre code dans 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) : renvoie la valeur de 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) : renvoie si la clé existe dans la configuration
    • __unset($name) : supprime la clé de la configuration
    Ajoutez également une méthode count() qui renvoie 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 second nom de paramètre. Créez une instance de Config et effectuez les opérations suivantes :
    • Définissez le premier paramètre avec la valeur donnée
    • Affichez si le premier paramètre existe à l’aide de 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 second paramètre (qui n’a jamais été défini)

Chaque sortie doit apparaître sur sa propre ligne. Les méthodes magiques vous permettent d’interagir avec votre objet Config en utilisant une syntaxe naturelle de propriété comme $config->theme = "dark" et isset($config->theme), même si aucune propriété réelle n’est définie.

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

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