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 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 .