28. Serializzare gli Oggetti

In questo capitolo vedremo come PHP ci consente di serializzare i nostri oggetti.

Serializzare un oggetto significa essenzialmente trasformarlo in una stringa (byte-stream di tutti i valori dell'oggetto) che rappresenterà l'istanza dell'oggetto al suo stato corrente, che potremo poi memorizzare dove preferiamo (es. Database MySQL, file di testo esterno ...).

Per fare questo useremo due funzioni native di PHP 5 : serialize() e la sua antagonista unserialize().

unserialize() ci consentirà di ricostruire l'oggetto che abbiamo precedentemente serializzato, ponendolo all'interno dell'istanza specificata.

Nell'esempio che segue definirò una classe d'esempio ContatoreAccessi, la cui istanza sarà serializzata in un file esterno "statistiche.txt" che conterrà l'oggetto in questione, il cui compito sarà quello di contare quante volte è stata aperta la pagina.

<?php

	class ContatoreAccessi
	{
		private $cont;

		public function MiaClasse($v)
		{ $this->cont = $v; }

		public function stampa()
		{ echo "Accessi : " . $this->cont; }

		public function aumenta()
		{ $this->cont++; }
	}

	$nomefile = "statistiche.txt";
	$dimensione = filesize($nomefile);

	if ($dimensione) // Se il file esiste e contiene più di un byte
	{
		$file = fopen($nomefile, "r"); // Apre il file in sola lettura
		$content = file_get_contents($nomefile); // Legge il contenuto del file e lo memorizza in $content

		$obj = unserialize($content); // Ricostruisce l'istanza deserializzando $content
		$obj->aumenta(); // Incrementa il contatore di accessi
	}
	else
		$obj = new ContatoreAccessi(1);

	$file = fopen($nomefile, "w+"); // Riapre il file in scrittura azzerandone il contenuto

	$ser = serialize($obj); // Serializza l'istanza
	fwrite($file, $ser); // Memorizza l'istanza serializzata
	fclose($file);

	echo $obj->stampa();

?>

Eseguendo il codice soprastante noterete che il contatore di accessi cresce ogni volta che aprite la pagina.
Aprendo "statistiche.txt" col Blocco Note e cancellandone il contenuto, azzererete il contatore di accessi.

Potete memorizzare gli oggetti serializzati ovunque come ad esempio un Database MySQL, mantenendo il preciso stato in cui si trova la vostra applicazione o se preferite parte di essa, notando subito il vantaggio che una volta effettuata la deserializzazione, otterrete immediatamente la vecchia istanza pronta da utilizzare, con i suoi attributi e i suoi metodi.

Abbiate cura che la definizione della classe dell'istanza che andrete a serializzare / deserializzare, sia sempre accessibile dai sorgenti che effettuano questo tipo di operazioni, o otterrete un oggetto inutile.