PHP Magic Methods
1.364 visiteNella versione 5 di PHP sono stati aggiunti alcuni metodi detti “magici”, i PHP Magic Methods, che è possibile utilizzare nella programmazione OOP (programmazione orientata agli oggetti).
Questi metodi sono identificati con due underscore come prefisso e agiscono come intercettori eseguiti dal sistema quando vengono soddisfatte determinate condizioni.
Questi metodi sono estremamente utili ma entriamo più nel dettaglio.
Di seguito la lista dei magic methods:
-
__construct()
-
__destruct()
-
__call()
-
__callStatic()
-
__get()
-
__set()
-
__isset()
-
__unset()
-
__sleep()
-
__wakeup()
-
__toString()
-
__invoke()
-
__set_state()
-
__clone()
Non è possibile creare dei metodi nostri con lo stesso nome dei php magic methods e più in generale PHP riserva i due underscore __ come prefisso ai metodi magici.
Nei prossimi paragrafi vedremo qualche esempio con i Magic Methods in azione.
__construct() e __destruct()
1 2 3 4 5 6 7 8 9 10 11 12 |
class MyClass { function __construct() { print "Costruttore\n"; $this->name = "MyClass"; } function __destruct() { print "Distruttore della classe " . $this->name . "\n"; } } $obj = new MyClass(); |
__call() e __callStatic()
__call() viene attivato quando si invocano metodi inaccessibili nel contesto di un oggetto. Per i metodi in un contesto statico si consiglia di utilizzare __callStatic().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class MyClass { public function __call($name, $arguments) { // Note: value of $name is case sensitive. echo "Chiamata metodo '$name' " . implode(', ', $arguments). "\n"; } public static function __callStatic($name, $arguments) { // Nota: il valore di $name e case sensitive. echo "Chiamata metodo Static '$name' " . implode(', ', $arguments). "\n"; } } $obj = new MyClass; $obj->runTest('Oggetto nel contesto'); MyClass::runTest('Oggetto nel contesto statico'); |
__get(), __set(), __isset() e __unset()
__set() viene eseguito alla scrittura dei dati e __get() nella lettura dei dati. __isset() e __unset() vengono chiamate quando vengono eseguite le relative funzioni PHP isset() e unset().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class foo { protected $_values = array(); public function __get($key) { return $this->_values[$key]; } public function __set($key, $value) { $this->_values[$key] = $value; } } |
__sleep() e __wakeup()
Questi metodi magici entrano in gioco durante la serializzazione degli oggetti.
PHP richiamerà il metodo __sleep() subito prima di una serializzazione di una istanza della nostra classe.
__wakeup() invece sarà chiamato subito dopo una deserializzazione dell’oggetto, rendendolo utile ad esempio per ristabilire una connessione al database chiusa prima della serializzazione.
Un’ altra differenza fra i due metodi è che __sleep() deve ritornare un’array contenente la lista degli attributi da serializzare, e questo ci consente di avere un controllo maggiore sulle serializzazioni della nostra classe.
Se omettete il valore di ritorno di __sleep() la serializzazione fallirà restituendo un valore NULL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class Connection { protected $link; private $server, $username, $password, $db; public function __construct($server, $username, $password, $db) { $this->server = $server; $this->username = $username; $this->password = $password; $this->db = $db; $this->connect(); } private function connect() { $this->link = mysql_connect($this->server, $this->username, $this->password); mysql_select_db($this->db, $this->link); } public function __sleep() { return array('server', 'username', 'password', 'db'); } public function __wakeup() { $this->connect(); } } |
__invoke()
Il metodo magico __invoke() viene chiamato quando uno si tenta di chiamare un oggetto come una funzione.
__clone()
Il metodo magico __clone() viene chiamato quando cloniamo un oggetto con la funzione clone().