Serializacja obiekt≤w - obiekty w sesjach

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.