Objektumok szerializációja, objektumok session-ökben

Megjegyzés: A PHP 3-ban az objektumok elveszítik az osztály-hozzárendelésüket a szerializációs, és deszerializációs folyamat során. Az eredmény objektum típusú, de nem tartozik semelyik osztályhoz, és nincs egy metódusa sem, tehát eléggé használhatatlan (csupán egy tömb, furcsa szintakszissal).

Figyelem

A következő információk csak a PHP 4-es változatára érvényesek.

A serialize() egy karaktersorozatot ad vissza, ami az átadott érték byte-sorozatban megadott megfelelője. Az unserialize() alakít vissza egy ilyen karaktersorozatot az eredeti értékké. A szerializációs folyamat során egy objektum átadásával elmenthetjük az objektum minden tulajdonságát (változóját). A függvények nem kerülnek elmentésre, csak az osztály neve.

Ahhoz, hogy az unserialize() segítségével vissza tudj állítani egy objektumot, az objektum osztályának definiálva kell lennie. Azaz, ha van egy $a objektumod (az A osztályból), az elso.php oldalon, és ezt szerializálod, kapsz egy karaktersorozatot, ami az A osztályra hivatkozik, és tartalmazza az összes $a-ban lévő változó (tulajdonság) értékét. Ha ezt a karaktersorozatot a masodik.php oldalon objektummá szeretnéd alakítani, újra létrehozva az A osztály $a nevű objektumát, az A osztály definíciója rendelkezésre kell, hogy álljon a masodik.php oldalon is. Ez úgy érhető el, hogy az A osztály definícióját egy külső állományban tárolod, és ezt alkalmazod mind az elso.php, mind a masodik.php oldalon.


aosztaly.inc:
  class A 
  {
      var $egy = 1;
    
      function egyet_mutat()
      {
          echo $this->egy;
      }
  }
  
elso.php:
  include("aosztaly.inc");
  
  $a = new A;
  $s = serialize($a);
  // tároljuk az $s-t valahol, ahol masodik.php megtalálja
  $fp = fopen("tarolas", "w");
  fputs($fp, $s);
  fclose($fp);

masodik.php:
  // ez szükséges, hogy a deszerializáció rendben legyen
  include("aosztaly.inc");

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

  // most már használható az egyet_mutat() metódus
  $a->egyet_mutat();

    

Ha session-öket alkalmazol, és a session_register() függvénnyel regisztálsz objektumokat, ezek az objektumok automatikusan szerializálódnak minden PHP program futása után, és deszerializálódnak minden további programban. Ez egyszerűen azt jelenti, hogy ezek az objektumok akármelyik oldalon feltűnhetnek, miután a session részévé váltak.

Erősen javasolt, hogy minden regisztrált objektum osztály definícióját betöltsd minden oldalon, még akkor is, ha éppen nem használod azokat. Ha ezt nem teszed meg, és egy objektum úgy deszerializálódik, hogy nem áll rendelkezésre az osztály definícója, el fogja veszteni az osztály hozzárendelését, és az stdClass osztály egy példánya lesz, metódusok nélkül, így használhatatlanná válik.

Ezért ha a fenti példában az $a a session részévé válik a session_register("a") hívással, be kell töltened az aosztaly.inc külső állományt minden oldalon, és nem csak az elso.php és masodik.php programokban.