35. I metodi magici __sleep() __wakeup e __set_state()

I primi due metodi magici che illustrerò in questo capitolo sono __sleep() e __wakeup(), che hanno in comune la Serializzazione degli Oggetti descritta in questa guida prima della serie sui metodi magici.

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.

Altra differenza importante 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.

Vediamo un esempio teorico :

<?php

	class Oggetto
	{
		public $attributo = "stringa";

		public function __sleep()
		{
			echo "L'oggetto sta per essere serializzato!<br>";
			return array("attributo");
		}

		public function __wakeup()
		{
			echo "L'oggetto è appena stato deserializzato!<br>";
		}
	}

	$obj = new Oggetto();

	$s = serialize($obj);
	echo "Oggetto serializzato = $s<br>";

	$u = unserialize($s);
	echo $u->attributo;

?>

Il codice produce il seguente risultato :

L'oggetto sta per essere serializzato!
Oggetto serializzato = O:7:"Oggetto":1:{s:9:"attributo";s:7:"stringa";}
L'oggetto è appena stato deserializzato!
stringa

Overload di __set_state()

__set_state() è un metodo statico che viene richiamato per l'esportazione delle classi tramite var_export().

L'unico parametro di questo metodo è un array contenente le proprietà esportate nella forma array ("proprietà" => valore, ...)

Il metodo è disponibile da PHP 5.1.0


E con questo capitolo abbiamo definitivamente concluso la serie sui metodi magici.