Serializando objetos - objetos em sessões

Nota : No PHP 3 , objetos perdem suas associações entre classes através do processo de serialização e desserialização . A variável resultante é do tipo objeto , mas sem classe nem métodos , algo bem sem utilidade ( de fato , ele se torna apenas um array com uma sintaxe engraçada ) .

Cuidado

As informações seguintes se aplicam somente ao PHP 4 .

serialize( ) retorna uma string contendo uma representação linear de qualquer valor que pode ser armazenado no PHP . unserialize( ) pode ser utilizado para recriar os valores da variável original . Usando serialize para salvar um objeto irá preservar todas as variáveis de um objeto . As funções de um objeto não serão salvas , apenas o nome da classe .

Para ser possível fazer o unserialize( ) de um objeto , a classe do objeto precisa estar definida . Ou seja , se você tem um objeto $a da classe A em page1.php e a serializa , você consegue uma string que se refere a classe A e contém todos os valores de variáveis contidos em $a . Se você precisa desserializa-la em page2.php , recriando $a da classe A , a definição da classe A precisa estar presente na page2.php . Isto pode por ser feito , por exemplo , armazenando a definição da classe A em um arquivo separado , incluindo este arquivo e ambos os arquivos page1.php e page2.php .

 
classe_a.inc.php

 
:

 
class

 
A

 
  {

 
var

 
$um

 
=

 
1

 
;

 
function

 
mostre_um(

 
)

 
      {

 
echo

 
$this

 
-

 
um

 
;

 
      }

 
  }

 
page1.php

 
:

 
include("classe_a.inc.php")

 
;

 
$a

 
=

 
new

 
A

 
;

 
$s

 
=

 
serialize($a)

 
;

 
/

 
/

 
armazena

 
$s

 
em

 
algum

 
lugar

 
que

 
page2,php

 
possa

 
encontra-la

 
$fp

 
=

 
fopen("armazenamento"

 
,

 
"w")

 
;

 
fputs($fp

 
,

 
$s)

 
;

 
fclose($fp)

 
;

 
page2.php

 
:

 
/

 
/

 
Isto

 
e

 
preciso

 
para

 
que

 
unserialize

 
funcione

 
normalmente

 
include("classe_a.inc.php")

 
;

 
$s

 
=

 
implode(""

 
,

 
@file("armazenamento"))

 
;

 
$a

 
=

 
unserialize($s)

 
;

 
/

 
/

 
Agora

 
podemos

 
usar

 
a

 
funcao

 
mostre_um(

 
)

 
do

 
objeto

 
$a

 
$a

 
-

 
mostre_um()

 
;



Se você está utilizando sessões e usar session_register( ) para registrar objetos , esses objetos serão serializados automaticamente no final de cada script PHP , e automaticamente desserializados em cada uma das páginas seguintes . Isto significa que esse objetos podem estar em qualquer uma de suas páginas desde que elas sejam parte de sua sessão .

É extremamente recomendável que você inclua as definições de classe de todos os objetos registrados de todas as suas páginas , mesmo que você não use essas classes em todas as suas páginas . Se você não o fizer e um objeto for desserializado sem sua definição de classe presente , ele perde usa associação com a classe e se torna um objeto da classe stdClass , sem qualquer funções disponíveis . o que as deixa silenciosamente sem funcionalidade .

Assim , se no exemplo acima $a se tornar parte de uma sessão pela utilização de session_register( "a" ) , você precisa incluir o arquivo classe_a.inc.php em todos as suas páginas , não somente em page1.php e page2.php .