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

  1. Blog o PHP » Archiwum Bloga » SPL exceptions - [...] interfejs Serializable - TUTAJ [...]

Pozostaw Odpowiedź