Recuperar objeto guardado dentro de uma $_SESSION
Olá Galera! neste post irei abordar a recuperação de objetos armazenados em uma variável superglobal $_SESSION. Um exemplo da utilização deste artifício é quando se necessita fazer a persistência de um objeto, como num sistema de login onde se guarda os dados do usuário logado ou em um sistema de pedidos online onde se faz a persistência de um carrinho de compras.
Mas abordando o problema, se você já se deparou com um erro parecido com esse:
Fatal error: main() The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "Produto"; of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in /home/blog/serialize.php on line 29
Não se desespere! Tudo parceria perfeito certo? você guardou o objeto bonitinho dentro da $_SESSION (e claro você chamou a função session_start() antes de tudo, não é?), assim:
$produto = new Produto(); $produto->__set('codigo', 123456); $produto->__set('descricao', 'Este é o meu produto'); $produto->__set('preco', 55.98); $_SESSION['meu_objeto'] = $produto;
E na hora de recuperar o maldito em outra página da sua aplicação deu de cara com o erro acima! Tudo bem, isso acontece porque o PHP precisa da definição da classe previamente carregada, isso deve acontecer pelo chamado “autoloading de objetos”, e a mágica se dá pela função sql_autoload_register que eu abordo neste post ou mais simplóriamente pela função mágica __autoload().
Tome como exemplo a nossa definição de classe:
class Produto { public $codigo, $descricao, $preco; public function __get($propriedade) { return $this->$propriedade; } public function __set($propriedade, $valor) { $this->$propriedade = $valor; } }
Nela declaramos três propriedades e os m métodos mágicos __set() e __get() tudo muito simples, esta classe é muito parecida (para não falar idêntica) a qualquer classe Model de uma arquitetura MVC.
E em nosso exemplo iremos utilizar a função mágica __autoload(), veja que sua implementação é bem simples:
function __autoload($class) { include '/minhas_classes/' . $class . '.php'; }
Agora ela ela simplesmente irá varrer o diretório “minhas_classes” em busca da classe que você colocou dentro da $_SESSION, no nosso exemplo ela irá buscar o arquivo chamado Produtos.php.
E pronto! problema resolvido!
Agora se sua aplicação é mais complexa sugiro que você dê uma olhada neste post, nele eu abordo a as funcionalidades da sql_autoload e algumas dicas.
Abraços,