Serializzazione e Deserializzazione - OOP in PHP
Indice
In PHP, la serializzazione viene utilizzata per trasformare un oggetto PHP in una stringa che può essere memorizzata in un database, in un file di testo, o inviata ad un'altra applicazione via rete.
La deserializzazione è il processo inverso di ricostruire un oggetto o una struttura dati complessa a partire dalla sua rappresentazione serializzata. In PHP, la deserializzazione viene utilizzata per ricostruire un oggetto o una struttura dati a partire dalla stringa serializzata, in modo da ripristinare la sua forma originale e poterla utilizzare di nuovo nell'applicazione.
In generale, la serializzazione e la deserializzazione consentono di salvare e trasferire informazioni complesse in un formato che sia facilmente gestibile e compatibile con diverse applicazioni e tecnologie.:
Sintassi di una serializzazione
$serialized_data = serialize($object);
In questo caso, $object
rappresenta l'oggetto che si desidera serializzare, mentre $serialized_data
è la stringa serializzata che verrà generata.
Sintassi di una deserializzazione
$object = unserialize($serialized_data);
In questo caso, $serialized_data
rappresenta la stringa serializzata che si desidera deserializzare e $object
è l'oggetto ricostruito.
Esempio di serializzazione e deserializzazione di un Oggetto
/* L'array viene trasformato in stringa e memorizzato all'interno del file
poi se ad esempio andiamo a leggere in un altro file questa informazione,
verrà letto il contenuto di questo file e verrà effettuata la serializzazione,
ovvero da questa stringa verrà ricreato questo array.
Il processo di serializzazione può essere effettuato senza problemi su un oggetto.
Se ad esempio, abbiamo bisogno di memorizzarlo in un file o in un database, solitamente
in un database non abbiamo la possibilità di memorizzare dati complessi come oggetti.
Per serializzare un oggetto possiamo usare la funzione serialize.
*/
class User {
public int $id;
public string $nome;
public UserColor $instanzaColore;
public function __construct(string $nome, array $colorePreferito){
$this->nome = $nome;
$this->id = rand(1,1000);
$this->instanzaColore = new UserColor($colorePreferito);
}
}
class UserColor{
public function __construct(public array $colorePreferito){
}
}
$user1 = new User("Donato",['Blu','Rosso']);
echo var_dump($user1);
$stringaSerializzata = serialize($user1);
echo $stringaSerializzata . "<br>";
$stringaDeserializzata = unserialize($stringaSerializzata);
var_dump($stringaDeserializzata);
$deepCopy = unserialize(serialize($user1)); // In questo modo creiamo una deep copy dell'oggetto.
var_dump($deepCopy);
Usare la serializzazione per creare una deep copy di un oggetto
E' possibile utilizzare unserialize(serialize($oggetto))
per creare una copia profonda (deep copy) di un oggetto in PHP.
La funzione serialize()
trasforma l'oggetto in una stringa serializzata che rappresenta l'oggetto, inclusi tutti i suoi attributi e valori. Questa stringa serializzata può essere poi utilizzata per ricostruire l'oggetto originale utilizzando la funzione unserialize()
.
Quando l'oggetto viene deserializzato, PHP costruisce una nuova istanza dell'oggetto a partire dalla stringa serializzata, creando una copia completa dell'oggetto originale. In questo modo, ogni attributo dell'oggetto e ogni valore verranno copiati nella nuova istanza dell'oggetto, creando una copia profonda dell'oggetto originale.
class MyClass {
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
// Creazione dell'oggetto originale
$my_object = new MyClass("Mario Rossi", 35);
// Creazione della copia profonda dell'oggetto
$my_deep_copy = unserialize(serialize($my_object));
// Modifica dell'oggetto originale
$my_object->name = "Luigi Bianchi";
$my_object->age = 40;
// Stampa delle proprietà dell'oggetto originale e della sua copia profonda
echo "Oggetto originale: " . $my_object->name . " " . $my_object->age . "\n"; // Luigi Bianchi 40
echo "Copia profonda: " . $my_deep_copy->name . " " . $my_deep_copy->age . "\n"; // Mario Rossi 35