Вы находитесь на странице: 1из 10

Serializao de objetos em PHP

Noes Bsicas

Serializao de objetos em PHP muito fcil e pode ser utilizado para uma variedade de propsitos diferentes. Ele pode ser utilizado para realizar algumas operaes bastante complexas, na verdade. Este artigo, o primeiro de uma srie de trs partes, apresenta a serializao de objetos e uma srie de tarefas para as quais voc pode colocar essa abordagem em prtica.

|ndice: | |Introduo | |Explicando os conceitos fundamentais | |Criao de objetos 'auto-serializveis' | |Criao de objetos 'auto-salvveis' | |Complemento do texto |

Introduo Qualquer pessoa que esteja usando Programao Orientada a Objeto em PHP por um tempo sabe que serializao de objetos pode ser uma abordagem til, que pode ser utilizada para diferentes fins. Se certos objetos precisam ser armazenados como uma representao String de seus mtodos e propriedades em uma tabela de banco de dados, ou mantido "vivo" de vrias solicitaes HTTP atravs de um mecanismo de Sesso, em todos estes casos, serializao, e sua contraparte desserializao, sem dvida, desempenha um papel relevante. Certamente uma das melhores coisas sobre serializao de objetos a sua extrema facilidade de realizao, confie em mim. Usando a combinao popular de funes nativa do PHP "serialize() / unserialize()", perfeitamente possvel obter um objeto serializado e vice-versa, durante a execuo de uma aplicao PHP, sem a necessidade de recorrer a tcnicas de programao sofisticadas. A verdade que quando se trata de objetos de serializao, PHP torna todo o processo uma tarefa acfalo. No entanto, apesar de sua facilidade, serializao de objeto pode ser usada em diferentes situaes, a fim de realizar as operaes mais complexas, tais como tornar um objeto persistente durante diferentes pginas web, ou tirando partido das funes mgicas "__sleep()" e "__wakeup()", que so chamadas automaticamente quando um objeto serializado e desserializado respectivamente. Como voc pode ver, a serializao de objetos em PHP uma abordagem muito til, que merece pelo menos uma anlise mais aprofundada. por isso que, ao longo desta srie de trs partes, eu vou aprofundar os temas mais relevantes sobre a serializao de objetos, comeando com o bsico, e, progressivamente, a introduo de conceitos mais avanados, como o uso de objetos em sesses , e armazen-los em tabelas de banco de dados.

O que voc deve esperar desta srie? At o fim de tudo, voc deve estar equipado com um conhecimento razovel de como serializar / deserializar objetos sem perder os seus mtodos e propriedades durante a transio, bem como a construo de objetos de sesso persistentes, e muito mais. Depois de estabelecidas as metas para esta srie, vamos nos apresentar para o vasto territrio de serializao de objetos em PHP. Vamos l!

Explicando os conceitos fundamentais A fim de ilustrar como um objeto, que convertido em uma representao de sequencia de bytes de seus mtodos e propriedades, pode ser serializado, eu vou criar um exemplo concreto que mostrar a sequncia completa de serializao / desertializao do objeto em questo. claro que, antes de qualquer tentativa de serializar um objeto, eu devo definir uma classe da qual eu possa criar instncias diferentes. Assim, aqui est um exemplo de classe PHP chamada "DataSaver", que simplesmente a tarefa de salvar uma seqncia de entrada para um arquivo de texto dado. Esta classe assim:

|| |class DataSaver { | || |var $data; | |var $fileDir; | || |function DataSaver($data) { | |if (!is_string($data)) { | |trigger_error('Invalid data type', E_USER_ERROR); | |} | |$this->data = $data; | |$this->fileDir = 'defaultDir'; | |} | || |// save data to file | |function save() { | |if (!$fp = fopen($this->fileDir . '/data.txt', 'w')) { | |trigger_error('Error opening datafile', E_USER_ERROR); | |} | |fwrite($fp, $this->data); | |fclose($fp); | |} | || |// fetch data from file | |function fetch() { |

|if (!$contents = file_get_contents($this->fileDir . '/data.txt')) { | |trigger_error('Error opening datafile', E_USER_ERROR); | |} | |return $contents; | |} | || |} |

Neste caso, a classe listada acima aceita como argumento de entrada uma string, que pode ser salva em um arquivo especfico e depois recuperada em um momento posterior, usando os mtodos "save()" e "fetch()" respectivamente. Agora, preste ateno para o trecho seguinte, em que uma instncia da classe "DataSaver" serializada, e por sua vez restaurada ao seu estado original: || |// instantiate 'datasaver' object | |$dataSaver=&new DataSaver('This string will be saved to file'); | |// save data to file | |$dataSaver->save(); | |// display sample data | |echo $dataSaver->fetch().''; | |// serialize object | |$dataObj=serialize($dataSaver); | |$dataObj=unserialize($dataObj); | |// call object methods after unserializing object | |echo $dataObj->fetch(); |

Como voc pode ver, o exemplo acima mostra algumas coisas interessantes. Observe como aps instanciar um objeto "DataSaver", e chamar seus mtodos "save()" e fetch() ", este objeto serializado e, em seguida, desserializado atravs das respectivas funes "serialize()/unserialize()". claro, a coisa mais importante a respeito do exemplo anterior consiste em enfatizar como o objeto pode ser restaurado ao seu estado original, o que significa que todos os seus mtodos podem ser chamados como o esperado. As linhas a seguir ilustram claramente este conceito:

|| |// serialize object | |$dataObj=serialize($dataSaver); | |$dataObj=unserialize($dataObj); | |// call object methods after unserializing object | |echo $dataObj->fetch(); |

A sada do fragmento acima o seguinte:

This string will be saved to file

Certamente, o exemplo anterior demonstra a facilidade, oferecido pelo PHP, de serializao de um objeto dentro de uma aplicao, bem como a inverso do processo e utilizando os mtodos do objeto e propriedades em conformidade. Este conceito pode ser potencialmente muito til, especialmente em situaes em que voc precisa salvar seus objetos, pelo menos temporariamente, e depois recuper-los em um momento posterior. Depois de mostrar o primeiro exemplo de como serializar / deserializar um objeto, eu espero que voc entenda como funciona todo o processo, bem como as possveis implementaes desta tcnica dentro de uma aplicao. Agora, hora de aprender a usar a serializao dentro de objetos, assim, a fim de aprender mais sobre esta abordagem, veja o prximo tpco.

Criao de objetos 'auto-serializveis' Tendo demonstrado como um objeto pode ser serializado a partir do exterior, o prximo passo consiste em mostrar como criar objetos que so capazes de serializar a si mesmos. Soa um pouco confuso? Mas no . Estude a seguinte classe com base no exemplo anterior, a qual tem a capacidade de serializar a si mesma: || |class DataSaver { | || |var $data; | |var $fileDir; | || |function DataSaver($data) { | |if (!is_string($data)) { | |trigger_error('Invalid data type', E_USER_ERROR); | |} | |$this->data = $data; | |$this->fileDir = 'defaultDir'; | |} | ||

|// save data to file | |function save() { | |if (!$fp = fopen($this->fileDir . '/data.txt', 'w')) { | |trigger_error('Error opening datafile', E_USER_ERROR); | |} | |fwrite($fp, $this->data); | |fclose($fp); | |} | || |// fetch data from file | |function fetch() { | |if (!$contents = file_get_contents($this->fileDir . '/data.txt')) { | |trigger_error('Error opening datafile', E_USER_ERROR); | |} | |return $contents; | |} | || |function saveSerialized() { | |if (!$fp = fopen($this->fileDir . '/data.txt', 'w')) { | |trigger_error('Error opening datafile', E_USER_ERROR); | |} | |fwrite($fp, serialize($this)); | |fclose($fp); | |} | || |} |

Como mostrado acima, agora a classe "DataSaver" tem um mtodo adicional, alm das que voc j viu no exemplo anterior. Neste caso, o mtodo "saveSerialized ()" leva o prprio objeto, em seguida, a serializar-se e, finalmente, salvar-se no arquivo de texto especificado. Muito interessante, certo? Um exemplo que explica como utilizar este recurso de auto-serializao ilustrado pelo trecho abaixo: || |// instantiate 'datasaver' object | |$dataSaver=&new DataSaver('This string will be saved to file'); | |// save data to file | |$dataSaver->save(); | |// save serialized object to file | |$dataSaver->saveSerialized(); |

Com referncia capacidade oferecida pelo mtodo "saveSerialized()", todos os objetos que tm a capacidade de serializar a si mesmos so comumente chamados de objetos auto-serializveis e, geralmente, so usados como objetos de base para derivar outros objetos que persistem durante a execuo de um aplicativo. Mas, na verdade, eu estou me adiantando. Leia a prxima seo do artigo, onde eu vou explicar como criar objetos

que so capazes de executar uma seqncia de serializao / desserializao de si mesmos.

Criao de objetos 'auto-salvveis' - PHP Como voc aprendeu na seo anterior, a criao de objetos que serializam-se um processo bastante abrangente, uma vez que tudo que voc tem a fazer adicionar classe correspondente de um mtodo capaz de salvar o objeto serializado em um arquivo especificado, ou em muitos casos, a uma tabela de banco de dados. No entanto, objetos 'auto-serializveis' so providos apenas com a capacidade de salvarse a um arquivo, ou mdia de armazenamento que voc quiser usar. Ento, e se eu te disser que possvel criar objetos que no s serializam e salvam em um arquivo em si, mas tambm so capazes de realizar um processo de auto-restaurao? Na verdade, esse tipo de objeto chamado de objeto "auto-salvamento", e a classe definida abaixo demonstra como cri-lo. D uma olhada em seu cdigo fonte: || |class ObjectSaver { | || |var $objectFile; | || |function ObjectSaver($objectFile = 'defaultDir/objects.txt') { | |$this->objectFile = $objectFile; | |$this->save(); | |} | || |// save serialized object to file | |function save() { | |if (!$fp = fopen($this->objectFile, 'w')) { | |trigger_error('Error opening objectfile', E_USER_ERROR); | |} | |if (!fwrite($fp, serialize($this))) { | |trigger_error('Error writing data to objectfile', E_USER_ERROR); | |} | |fclose($fp); | |} | || |// fetch object from file | |function fetch() { | |if (!$obj = unserialize(file_get_contents($this->objectFile))) { | |trigger_error('Error fetching object fromfile', E_USER_ERROR); | |} | |return $obj; | |} | || |} |

Como voc pode ver, a classe exemplo "ObjectSaver" que eu codificado acima mostra um exemplo tpico de como criar um objeto que capaz de serializao e desserializao de si. Neste caso, sempre que o objeto instanciado, ele vai ser serializado e salvo em um arquivo de texto, enquanto a fim de realizar o processo inverso, o mtodo "fetch ()" deve ser chamado explicitamente. Para complementar o conceito de criao de 'auto-salvamento' de objetos, a classe acima usa um arquivo de texto simples, tanto para armazenar o objeto serializado e restaur-lo de volta ao seu estado original. No entanto, como eu disse antes, voc pode usar uma tabela de banco de dados para armazenar objetos serializados, ou mesmo cookies, no caso de sua aplicao no exigir requisitos de armazenamento enormes. Agora que voc aprendeu como criar 'auto-salvamento' de objetos com base na classe "ObjectSaver" que eu definido anteriormente, d uma olhada no exemplo a seguir, que demonstra como usar esses objetos: || |// instantiate 'objectsaver' object | |$objSaver=&new ObjectSaver(); | |// fetch unserialized object | |$newObj=$objSaver->fetch(); |

Como ilustrado acima, depois que um novo objeto "ObjectSaver" foi instanciado, seu mtodo "fetch ()" chamado explicitamente, a fim de 'deserializar' o objeto e armazenlo na varivel "$ newobj". Depois de estudar o exemplo anterior, talvez voc esteja se perguntando: O que o ponto de restaurao do objeto ao seu estado original, quando ele j estava disponvel no momento de ser instanciado? Bem, na verdade isso faz muito sentido se voc levar em conta que o respectivo mtodo "fetch ()" pode ser modificado, vamos dizer para voltar no o objeto inteiro, mas apenas uma propriedade especfica (ou um conjunto de propriedades), que deve persistir em pginas web diferentes. Fazendo isso, voc estar indo diretamente em direo ao conceito de um objeto "persistente", a propsito de um tema que eu vou cobrir no segundo tutorial. Por agora, seja paciente e tenha algumas experiencias divertidas com a classe anterior "ObjectSaver", que pode ser ligeiramente modificada para exibir uma mensagem trivial, quando o mtodo "fetch ()" chamado apropriadamente. Considerando esta pequena alterao, a verso modificada da classe "ObjectSaver" ficaria assim:

|| |class ObjectSaver { | || |var $objectFile; | || |function ObjectSaver($objectFile = 'defaultDir/objects.txt') { | |$this->objectFile = $objectFile; | |$this->save(); | |} | || |// save serialized object to file | |function save() { | |if (!$fp = fopen($this->objectFile, 'w')) { | |trigger_error('Error opening object file', E_USER_ERROR); | |} | |if (!fwrite($fp, serialize($this))) { | |trigger_error('Error writing data to objectfile', E_USER_ERROR); | |} | |fclose($fp); | |} | || |// fetch object from file | |function fetch() { | |if (!$obj = unserialize(file_get_contents($this->objectFile))) { | |trigger_error('Error fetching object fromfile', E_USER_ERROR); | |} | |return $obj; | |} | || |// display message | |function displayMessage() { | |return 'This is an object that saves and retrieves itself via its methods!'; | |} | || |} |

E, eventualmente, um objeto"ObjectSaver" pode ser utilizado como se segue: || |$objSaver=&new ObjectSaver(); | |$newObj=$objSaver->fetch(); | |echo $newObj->displayMessage(); |

De acordo com o fragmento acima, a sua sada poderia ser como se segue: This is an object that saves and retrieves itself via its methods! Como voc pode ver, o objeto em questo 'deserializa-se' e exibe a mensagem de

exemplo correspondente, o que demonstra que o mtodo "fetch ()" restaura o objeto ao seu estado original depois de ser salvo para o arquivo especificado pelo mtodo "save ()" . Serializao de objetos no um processo bastante abrangente? Para encerrar Nesta primeira parte da srie, espero que voc aprendeu o bsico de serializao de objetos em PHP, incluindo alguns conceitos interessantes, como a criao de objetos que so capazes de salvar e recuperar-se atravs de seus prprios mtodos. Ao longo do segundo artigo, vou explicar como criar objetos persistentes, alm de implementar as funes mgicas "__sleep ()" e "__wakeup ()".

Complemento do texto: Eis um exemplo simples em serializao / deserializao um objeto para fins de armazenamento. Ele usa um arquivo para salvar o objeto, mas voc pode querer usar uma tabela de banco de dados em vez disso: || |// page1.php | |// define 'User' class | |class User { | |private $name = 'John'; | |private $email = 'Doe'; | |// constructor | |public function __construct($name = '', $email = '') { | |if ($name != '') { | |$this->name = $name; | |} | |if ($email != '') { | |$this->email = $email; | |} | |} | |// get user name | |public function get_name() { | |return $this->name; | |} | |// get user's email address | |public function get_email() { | |return $this->email; | |} | || |function __toString() { | |return 'Name: ' . $this->name . ' Email: ' . $this->email; | |} | |} | |$user = new User(); |

|$seruser = serialize($user); | |// save serialized user to file | |file_put_contents('myfile', $seruser); | |// page2.php | |// get user from file | |$user = unserialize(file_get_contents('myfile')); |

Вам также может понравиться