PHP Velho Oeste 2024

Serialização de objetos - objetos na sessão

A função serialize() retorna uma string contendo uma representação de stream de bytes de qualquer valor que pode ser persistido em PHP. A função unserialize() pode utilizar-se desta string para recriar o valor original. Utilizando serialização para persistir um objeto, salva todas as variáveis deste objeto. As funções em um objeto não serão persistidas, somente o nome da classe.

Para ser capaz utilizar a função unserialize() em um objeto a classe deste objeto precisa estar definida. Isto é, se você possui um objeto $a de uma classe A em page1.php e o serializa, você irá possuir uma string que se refere à classe A contendo os valores das variáveis atribuídos em $a. Se você deseja ser capaz de deserializar isto em page2.php, recriando $a da classe A, a definição da classe A precisa estar presente em page2.php. Isto pode ser feito por exemplo ao se gravar a definição da classe A em um arquivo e o incluí-lo em ambos os arquivos page1.php e page2.php.

<?php
// classa.inc:
  
  
class {
      var 
$one 1;
    
      function 
show_one() {
          echo 
$this->one;
      }
  }
  
// page1.php:

  
include("classa.inc");
  
  
$a = new A;
  
$s serialize($a);
  
// grava $s em algum lugar onde page2.php possa acessá-lo.
  
$fp fopen("store""w");
  
fwrite($fp$s);
  
fclose($fp);

// page2.php:
  
  // isto é necesário para a deserialização ocorrer corretamente.
  
include("classa.inc");

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

  
// agora utilize a função show_one() do objeto $a.  
  
$a->show_one();
?>

Se você está utilizando sessões e a função session_register() para registrar objetos, estes objetos são serializados automaticamente ao final de cada página PHP, e deserializados automaticamente no início das páginas seguintes. Isto basicamente significa que estes objetos podem ser utilizados em qualquer parte de suas páginas por fazerem parte de sua sessão.

É fortemente recomentado que você inclua as definições das classes de todos os objetos registrados em todas as páginas, mesmo que você não vá utilizá-lo em todas as suas páginas. Se você não o fizer e um objeto for deserializado sem sua classe definida, ele perderá a associação com a classe e se tornará um objeto do tipo __PHP_Incomplete_Class_Name sem nenhuma função disponível, ou seja, se tornará praticamente inútil.

Então se no exemplo acima $a se tornar parte da sessão ao se executar session_register("a"), você deve incluir o arquivo classa.inc em todas as suas páginas, não somente em page1.php e page2.php.

add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top