Oprócz implementacji funkcji magicznych __sleep() i __wakeup() istnieje alternatywne rozwiązanie, pozwalające przejąć kontrolę nad serializacją obiektów. Mowa o interfejsie Serializable. Przyjrzyjmy się mu z bliska:
interface Serializable {
abstract public string serialize ( void )
abstract public mixed unserialize ( string $serialized )
}
Tak więc:
- serialize() – wywoływana przy serializacji obiektu klasy. Zwraca string, z danymi które poddaliśmy temu procesowi.
- unserialize($data) – wywoływana przy deserializacji. Przesłania konstruktor klasy.
Pozostaje napisanie przykładowej klasy korzystającej z możliwości przedstawionego przeze mnie interfejsu. Spójrzmy:
class Example implements Serializable {
public $a;
public $b;
public function __construct () {
$this->a = 122;
$this->b = 12;
}
public function serialize () {
return serialize($this->a);
}
public function unserialize ($data) {
$this->a = unserialize($data);
}
public function Seta ($setme) {
$this->a = $setme;
}
}
Oraz użycie:
$obj = new Example(); $obj->Seta(1); $se = serialize($obj); var_dump($se); $un = unserialize($se); var_dump($un);
Zwróćmy uwagę na fakt, iż używając serialize() serializujemy tylko właściwość $this->a. Notomiast wywołanie unserialize() przywraca nam obiekt, ale atrybut $this->b ma wartość NULL, bo nie jest wywoływany konstruktor klasy. Warto o tym pamiętać.


Brak odpowiedzi : “serializable”
Trackbacks/Pingbacks