Serializacija objektov - objekti in seje

Opomba: V PHP 3, objekti izgubijo svojo asociacijo z razredom med procesom serializacije in odserializacije. Dobljena spremenljivka je tipa objekt, a nima nobenega razreda ali metod, torej je dokaj neuporabna (postane isto kot tabela s smešno sintakso).

Opozorilo

Naslednja informacija velja samo za PHP 4.

Funkcija serialize() vrne niz, ki vsebuje byte-stream reprezentacijo katerekoli vrednosti ki je lahko shranjena v PHP-ju. Funkcija unserialaze() lahko uporabi ta niz za obnovo originalnih vrednosti spremenljivke. Uporaba serialize za shranjevanje objekta bo ohranilo vse sremenljivke v objektu. Funkcije v razredu ne bojo shranjene, shranjeno bo le ime razreda.

Da bi lahko s funkcijo unserialize() odserializirali objekt, mora bit razred tega objekta definiran. To pomeni, če imate objekt $a razreda A na strani page1.php in serializirate to, boste dobili niz, ki se nanaša na razred A in vse vrednosti spremenljivk, ki so v objektu $a. Če želite odserializirati to na strani page2.php, obnoviti $a iz razreda A, mora biti definicija razreda A definirana. To lahko naprimer dosežemo z definicijo razreda v neki datoteki, ki jo v vključimo v obe strani.

classa.inc:
  class A
  {
      var $one = 1;
    
      function show_one()
      {
          echo $this->one;
      }
  }
  
page1.php:
  include("classa.inc");
  
  $a = new A;
  $s = serialize($a);
  // shranimo $s nekam, kjer ga bo page2.php lahko nasla.
  $fp = fopen("store", "w");
  fputs($fp, $s);
  fclose($fp);

page2.php:
  // to je potrebno za pravilno delovanje funkcije unserialize.
include("classa.inc");

  $s = implode("", @file("store"));
  $a = unserialize($s);

  // sedaj lahko uporabimo funkcijo show_one() objekta $a.  
  $a->show_one();

Če uporabljate seje in uporabljate funkcijo session_register() za registracijo objektov, bodo objekti avtomatsko serializirani na koncu PHP strani, in seveda avtomatsko odserializirani na vsaki naslednji strani. To nasplošno pomeni, da se lahko ti objekti pojavljajo na vsaki strani, ko so del vaše seje.

Zelo priporočljivo je, da vključite definicije vseh tako registriranih objektov na vseh straneh, čeprav mogoče kakšnega ne uporabljate na vsaki strani. Če to ne naredite in da se objekt odserializira brez definicije svojega razreda, bo izgubil vse asociacije z razredom in bo postal objekt razreda stdClass brez funkcij. Torej bo postal neuporaben.

Torej če v zgornjem primeru $a postane del seje z uporabo funkcije session_register("a"), bi morali vključiti datoteko classa.inc v vse vaše strani, ne samo na strani page1.php in page2.php.