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,

Tiago.

Tags:,

Add a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *