__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 - 42Il 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:
existsQuesti 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.
Sfida
FacileCreiamo 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 classeConfigche 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
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 diConfiged 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)
?>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
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online