Notatka: W PHP 3 obiekty trac▒ powi▒zania miΩdzy klasami w czasie procesu serializacji i odserializacji. Wynikowa zmienna bΩdzie typu obiekt, ale bez klasy i bez metod, a wiΩc w zasadzie bezu┐yteczn▒ (zostanie poprostu zmienn▒ ze ╢mieszn▒ sk│adni▒).
Uwaga! |
Poni┐sze informacje dotycz▒ tylko PHP 4. |
serialize() zwraca string bΩd▒cy reprezentacj▒ dowolnej warto╢ci, kt≤ra mo┐e byµ przechowywana przez PHP. unserialize() mo┐e u┐yµ tego stringu aby odtworzyµ orginalne warto╢ci zmiennej. U┐ycie serializacji do zapisania obiektu zachowa wszystkie zmienne z obiektu. Zapisane nie bΩd▒ funkcje z obiektu, a jedynie nazwa klasy.
Aby istnia│a mo┐liwo╢µ u┐ycia funkcji unserialize() do odzyskania obiektu, musi byµ zdefiniowana klasa tego obiektu. Oznacza to, ┐e je╢li obiekt $a klasy A istnieje na page1.php i zserializujesz go, otrzymasz string, kt≤ry odnosi siΩ do klasy A i zawiera warto╢ci wszystkich zmiennych zawartych w $a. Je╢li chcesz, aby istnia│a mo┐liwo╢µ odserializacji tego obiektu na page2.php, na page2.php musi istnieµ definicja klasy A. Mo┐na to zrobiµ na przyk│ad przez przechowywanie definicji klasy A w zewnΩtrznym pliku includowanym przez page1.php i page2.php.
classa.inc: class A { var $jeden = 1; function pokaz_jeden() { echo $this->jeden; } } page1.php: include("classa.inc"); $a = new A; $s = serialize($a); // przechowaj $s gdzie╢, gdzie page2.php bΩdzie mog│a go znale╝µ $fp = fopen("store", "w"); fputs($fp, $s); fclose($fp); page2.php: // to jest niezbΩdne aby funkcja unserialize dzia│a│a prawid│owo. include("classa.inc"); $s = implode("", @file("store")); $a = unserialize($s); // teraz u┐yj funkcji pokaz_jeden z obiektu $a. $a->pokaz_jeden(); |
Je╢li u┐ywasz sesji i session_register() do rejestracji obiekt≤w, te obiekty s▒ serializowane automatycznie na ko±cu ka┐dej strony PHP i odserializowane automatycznie na ka┐dej z nastΩpnych stron. Zasadniczo znaczy to, ┐e te obiekty mog▒ pokazaµ siΩ na dowolnej z twoich stron je╢li tylko stan▒ siΩ czΩ╢ci▒ twojej sesji.
Mocno zalecane jest includowanie definicji klas wszystkich zarejestrowanych obiekt≤w na wszystkich twoich stronach, nawet je╢li nie u┐ywasz tych zmiennych na twoich stronach. Je╢li tego nie zrobisz a obiekty zostan▒ odserializowane bez definicji klasy, powi▒zania klasowe zostan▒ utracone a obiek stanie siΩ obiektem klasy stdClass bez ┐adnych dostΩpnych funkcji, a wiΩc bΩdzie ca│kiem bezu┐yteczny.
A wiΩc je╢li w powy┐szym przyk│adzie $a stanie siΩ czΩ╢ci▒ sesji przez wywo│anie session_register("a"), powinieneµ includowaµ plik classa.inc na wszystkich stronach, nie tylko page1.php i page2.php.
Poprzedni | Spis tre╢ci | NastΩpny |
parent | Pocz▒tek rozdzia│u | Magiczne funkcje __sleep i __wakeup |