Objektumok szerializációja, objektumok session-ökben
Note: 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).
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() visszaalakÃt 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 lehessen állÃtani egy objektumot, az objektum osztályának (tÃpusának) már definiálva kell lennie. Ez a következÅ‘ket jelenti egy példán keresztül megvilágÃtva: Ha az elso.php oldalon az A osztályú $a objektumot szerializálod, akkor kapsz egy olyan karaktersorozatot, amely 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ű objektumot, akkor az A osztály definÃciójának rendelkezésre kell állnia 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.
<?php
// 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");
fwrite($fp, $s);
fclose($fp);
// masodik.php:
// ez szükséges, hogy a deszerializáció rendben menjen
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") meghÃvásával, akkor be kell töltened az aosztaly.inc külsÅ‘ állományt minden oldalon, nem csak az elso.php és masodik.php programokban.