IL METODO MAGICO DESTRUCT
Solitamente il costruttore viene invocato automaticamente in fase di creazione di un oggetto, serve a inizializzare le proprietà con i valori passati in input, in generale inizializza proprietà e servizi utilizzati dalla classe, per servizi intendo altri oggetti di cui la classe potrebbe necessitare. Allo stesso modo quando un oggetto non necessità più di essere in memoria o perché lo script termina o perché non vi sono più riferimenti a quell’oggetto PHP chiama il metodo __destruct(). Il metodo __destruct() non è un vero e proprio distruttore ma serve a fare delle operazioni prima che l’oggetto venga effettivamente distrutto, ad esempio chiudere un file aperto, una connessione a un database etc.
I METODI MAGICI SLEEP, WAKEUP, SERIALIZE E UNSERIALIZE
Quando serializziamo un oggetto potremmo voler impedire la serializzazione di alcune proprietà, e quando deserializziamo vorremmo poter effettuare alcune operazioni. Se ad esempio non vogliamo serializzare una proprietà usiamo il metodo magico __sleep();
MODIFICHIAMO IL CODICE DELLA CLASSE FILE MANAGER
Riprendiamo il codice della classe FileManager uitlizzando la classe SplFileObject in modo da rendere il codice più OOP e meno procedurale.
Questo è il var_dump() di $testfile2.
I METODI MAGICI SERIALIZE E UNSERIALIZE
Come si vede dal var_dump() la proprietà fileObj non è inizializzata, non tutti gli oggetti sono serializzabili, quindi non possiamo usare il metodo read() per leggere il file. Il problema si risolve con il metodo magico __wakeup(). I metodi magici __sleep() e __wakeup() vengono rispettivamente usati in fase di serializzazione e de serializzazione. Da PHP 7.4 sono stati sostituiti con __serialize() e __unserialize().
I METODI MAGICI GET E SET
Non possiamo accedere a proprietà private o protected dal global scope il metodo magico __get controlla l’accesso a proprietà non esistenti o non accessibili. __set assegna un valore a una proprietà, private o protected.
IL METODO MAGICO CALL
Come sappiamo le classi che scriviamo non devono essere troppo grandi ma compatte ed inserite in un contesto ben più ampio. Se una classe non ha tutte le funzionalità al proprio interno, da qualche parte deve averle per portare a termine il proprio compito. Uno dei metodi che abbiamo studiato è l’ereditarietà. Se entriamo nel metodo __call significa che ho il metodo esiste all’interno della classe Course però non è accessibile, oppure non esiste nella classe Course ma esiste nella classe EmailService. Il metodo magico __call() può essere utile per delegare l’invocazione di un metodo di una classe da un’altra classe.
IL METODO MAGICO CALLSTATIC
È del tutto simile al metodo __call() solo che in questo caso __callStatic() è inerente ai metodi statici. __callStatic() intercetta il metodo non esistente nel codice sotto riportato.
APPROFONDIMENTO
In PHP, ci sono diversi “metodi magici” che permettono di eseguire operazioni specifiche su oggetti. Questi metodi magici iniziano sempre con un doppio underscore (__) e sono usati per definire comportamenti speciali in certe situazioni. Di seguito ti spiego i metodi magici che hai richiesto: __serialize(), __unserialize(), __sleep(), __wakeup(), __call(), e __callStatic().
1. __serialize() e __unserialize()
Questi due metodi magici vengono usati per la serializzazione e deserializzazione degli oggetti. A partire da PHP 7.4, è preferibile usare __serialize() e __unserialize() invece di __sleep() e __wakeup() per una gestione più robusta e moderna della serializzazione.
• __serialize()
Questo metodo viene chiamato quando si esegue la serializzazione di un oggetto con serialize(). Il suo scopo è restituire una rappresentazione array-friendly dell’oggetto.
class MyClass {
private $data;
public function __construct($data) {
$this->data = $data;
}
public function __serialize(): array {
return [‘data‘ => $this->data];
}
}
$obj = new MyClass(“example data“);
$serialized = serialize($obj);
• __unserialize()
Viene chiamato quando un oggetto viene deserializzato con unserialize(). Prende in input un array, tipicamente restituito da __serialize().
class MyClass {
private $data;
public function __unserialize(array $data): void {
$this->data = $data[‘data’];
}
}
$unserialized = unserialize($serialized);
2. __sleep() e __wakeup()
Questi metodi magici sono utilizzati nella serializzazione e deserializzazione degli oggetti in versioni precedenti di PHP (prima di PHP 7.4).
• __sleep()
Questo metodo viene chiamato quando si serializza un oggetto con serialize(). È usato per restituire un array contenente i nomi delle proprietà che si desidera serializzare. Permette anche di fare pulizie, come chiudere connessioni a database prima della serializzazione.
class MyClass {
private $data;
public function __sleep() {
return [‘data’]; // Solo la proprietà ‘data’ verrà serializzata
}
}
• __wakeup()
Viene chiamato durante la deserializzazione con unserialize(). È usato, ad esempio, per ristabilire connessioni a database o rigenerare risorse.
class MyClass {
private $data;
public function __wakeup() {
// Ristabilire connessioni o eseguire altre operazioni necessarie
}
}
3. __call()
Questo metodo viene chiamato quando viene invocato un metodo che non esiste o è inaccessibile (ad esempio, privato o protetto) su un oggetto. Accetta due parametri: il nome del metodo chiamato e un array di argomenti passati.
class MyClass {
public function __call($name, $arguments) {
echo “Il metodo ‘$name’ non esiste. Parametri: ” . implode(‘, ‘, $arguments);
}
}
$obj = new MyClass();
$obj->nonExistingMethod(‘arg1’, ‘arg2’);
4. __callStatic()
Simile a __call(), ma si applica a metodi statici. Questo metodo viene chiamato quando viene invocato un metodo statico che non esiste o non è accessibile.
class MyClass {
public static function __callStatic($name, $arguments) {
echo “Il metodo statico ‘$name’ non esiste. Parametri: “ . implode(‘, ‘, $arguments);
}
}
MyClass::nonExistingStaticMethod(‘arg1’, ‘arg2’);
Sintesi
•__serialize() e __unserialize(): per serializzazione e deserializzazione personalizzate (a partire da PHP 7.4).
•__sleep() e __wakeup(): versioni precedenti di serializzazione e deserializzazione.
•__call(): gestisce chiamate a metodi non esistenti o inaccessibili su oggetti.
•__callStatic(): gestisce chiamate a metodi statici non esistenti o inaccessibili.
Questi metodi sono strumenti potenti per controllare il comportamento degli oggetti e delle loro proprietà in situazioni specifiche.
Lascia un commento