Menu
Coddy logo textTech

__get, __set, __isset, __unset

Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 46 di 91.

PHP fornisce quattro metodi magici che intercettano l'accesso alle proprietà: __get(), __set(), __isset() e __unset(). Vengono attivati quando provi ad accedere a proprietà che non esistono o non sono accessibili.

Il metodo __get() viene chiamato quando si legge una proprietà inaccessibile, mentre __set() gestisce la scrittura di una proprietà. Questo ti permette di creare proprietà dinamiche o di aggiungere logica quando si accede alle proprietà:

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

Output:

Hello - 42

Il metodo __isset() viene attivato da isset() o empty(), e __unset() risponde alla funzione 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";

Output:

exists

Questi metodi sono comunemente usati per creare contenitori di dati flessibili, implementare il caricamento differito o creare oggetti che si comportano come array mantenendo una struttura orientata agli oggetti.

challenge icon

Sfida

Facile

Creiamo un gestore flessibile della configurazione che memorizza dinamicamente le impostazioni usando i metodi magici. La tua classe intercetterà l'accesso alle proprietà per gestire i valori di configurazione, verificare se le impostazioni esistono e rimuoverle quando necessario: tutto senza definire esplicitamente ogni proprietà.

Organizzerai il codice in due file:

  • Config.php: Crea una classe Config che usa un array privato per memorizzare internamente i valori di configurazione. Implementa tutti e quattro i metodi magici delle proprietà:
    • __get($name): Restituisce il valore della chiave specificata oppure "undefined" se la chiave non esiste
    • __set($name, $value): Memorizza il valore sotto la chiave specificata
    • __isset($name): Restituisce se la chiave esiste nella configurazione
    • __unset($name): Rimuove la chiave dalla configurazione
    Aggiungi anche un metodo count() che restituisce il numero di impostazioni memorizzate.
  • main.php: Includi il file Config. Riceverai tre input: un nome di impostazione, un valore di impostazione e un secondo nome di impostazione. Crea un'istanza di Config ed esegui queste operazioni:
    • Imposta la prima impostazione sul valore specificato
    • Stampa se la prima impostazione esiste usando isset(): restituisci "exists" oppure "missing"
    • Stampa il valore della prima impostazione
    • Stampa il conteggio attuale delle impostazioni
    • Usa unset() per rimuovere la prima impostazione
    • Stampa se la prima impostazione esiste ora: restituisci "exists" oppure "missing"
    • Stampa il valore della seconda impostazione (che non è mai stata impostata)

Ogni output deve essere su una riga separata. I metodi magici ti permettono di interagire con il tuo oggetto Config usando una sintassi naturale per le proprietà, come $config->theme = "dark" e isset($config->theme), anche se non è definita alcuna proprietà effettiva.

Provalo tu

<?php

require_once 'Config.php';

// Leggi gli input
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));

// TODO: Crea un'istanza di Config

// TODO: Imposta la prima configurazione sul valore fornito

// TODO: Stampa se la prima configurazione esiste ("exists" o "missing")

// TODO: Stampa il valore della prima configurazione

// TODO: Stampa il numero attuale di configurazioni

// TODO: Usa unset() per rimuovere la prima configurazione

// TODO: Stampa se la prima configurazione esiste ora ("exists" o "missing")

// TODO: Stampa il valore della seconda configurazione (che non è mai stata impostata)

?>
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore PHP online