Serialização de objetos no PHP

Algo que eu gosto muito no PHP são os metodos magicos, e dois que eu recentemente aprendi foram os metodos __sleep e __wakeup, que são extremamente uteis para se trabalhar com serialização de objetos.

Vou demostrar abaixo como usar estes metodos e recomendo fortemente que eles sejam testados, para vocês realmente ver como estes metodos funcionam.

class Automovel {

        protected $fabricante;
        public $modelos;

        public function __construct( $fabricante ) {
                $this->fabricante = $fabricante;
                $this->ObtemModelos();
        }

        private function ObtemModelos() {
                switch ($this->fabricante) {
                        case ‘Fiat’:
                                $this->modelos = array(‘Palio’, ‘Stylo’, ‘Linea’);
                                break;
                        case ‘Ford’:
                                $this->modelos = array(‘KA’, ‘Fiesta’, ‘Focus’);
                                break;
                        default:
                                $this->modelos = array();
                                break;
                }
        }

        /**
         * Metodo que será chamado na serialização do objeto
         * Este metodo deve retornar um array com os nomes dos campos que serão guardados
         * @return array
         */

        public function __sleep() {
                return array( ‘fabricante’ );
        }

        /**
         * Metodo que será chamado quando formos reconstruir o objeto atraves de sua versão serializada
         */

        public function __wakeup() {
                $this->ObtemModelos();
        }
}

// Instancia um novo objeto
$carros = new Automovel(‘Fiat’);
var_dump( $carros->modelos );

// Serializa o objeto
$teste = serialize( $carros );
var_dump( $teste );

// Retorna o objeto ao seu estado atraves de sua serialização
$carros2 = unserialize( $teste );
var_dump( $carros2->modelos ) ;

Pelo codigo acima da pra notar que são metodos muito simples, mas que são de uma utilidade imensa. Uma aplicação simples disso seria em formularios multi-paginas ou então para Ajax.

Referências: http://www.php.net/manual/en/language.oop5.magic.php

Comments (1)

Ari Garciajaneiro 15th, 2009 at 18:46

Ótimo exemplo! Este tipo de problema é muito útil para solucionar problemas de “persistência” de resources do PHP, tipo um objeto de conexão mysqli, por exemplo. Se puder colocar algum exemplo do tipo também seria ótimo!!

Vlw!

Leave a comment

Your comment