Files
archived-doc-pt-br/language/oop5/serialization.xml
2024-04-22 22:25:13 -03:00

114 lines
3.9 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: f94d903985119d3ac00f4528551df947f57b667f Maintainer: fernandowobeto Status: ready --><!-- CREDITS: fabioluciano,ABDALAZARD,WilliamSampaio,fernandowobeto -->
<!-- TODO reescreva para remover o uso de "você" e fale sobre __serialize/_unserialize -->
<sect1 xml:id="language.oop5.serialization" xmlns="http://docbook.org/ns/docbook">
<title>Serialização de Objetos</title>
<titleabbrev>Serialização de Objetos - Objetos em sessões</titleabbrev>
<para>
A função <function>serialize</function> retorna uma string contendo uma
representação byte-stream de qualquer valor que pode ser armazenado pelo
PHP. A função <function>unserialize</function> pode utilizar essa string para
recriar os valores originais da variável. Utilizar a serialização para
salvar um objeto, salvará todas as variáveis de um objeto. Os
métodos de um objeto não serão salvos, apenas o nome da
classe.
</para>
<para>
Para desserializar um objeto com a função <function>unserialize</function>, a
classe desse objeto precisa estar definida. Isto é, se possuir um objeto
da classe A e serializá-lo, você obterá
uma string que referencia a classe A e contêm todos os valores de variáveis
contidas nele. Se desejar deserializar este objeto
em outro arquivo, um objeto da classe A, a
definição da classe A deve estar presente neste arquivo.
Isso pode ser feito, por exemplo, armazenando a definição da classe A
em um arquivo, e incluí-lo, fazendo uso da função
<function>spl_autoload_register</function>.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// A.php:
class A {
public $one = 1;
public function show_one() {
echo $this->one;
}
}
// page1.php:
include "A.php";
$a = new A;
$s = serialize($a);
// store $s somewhere where page2.php can find it.
file_put_contents('store', $s);
// page2.php:
// this is needed for the unserialize to work properly.
include "A.php";
$s = file_get_contents('store');
$a = unserialize($s);
// now use the function show_one() of the $a object.
$a->show_one();
?>
]]>
</programlisting>
</informalexample>
<para>
É fortemente recomendado que, quando uma aplicação serializa seus objetos, para
uso posterior na aplicação, esta inclua a definição da classe
do objeto em questão ao longo de toda aplicação. Não fazer isso pode resultar em
objetos serem desserializados sem a definição da classe, que acarretará no
PHP entregar um objeto da classe <classname>__PHP_Incomplete_Class_Name</classname>,
que não possui métodos, tornando o objeto inútil.
</para>
<para>
Então, se, no exemplo anterior, <varname>$a</varname> se tornou parte da sessão
adicionando uma nova chave no array superglobal <varname>$_SESSION</varname>, você deve incluir o
arquivo <literal>A.php</literal> em todas suas páginas, e não somente em <filename>page1.php</filename>
e <filename>page2.php</filename>.
</para>
<para>
Além dos conselhos acima, note que pode-se capturar os eventos de serialização
e desserialização de um objeto usando os métodos
<link linkend="object.sleep">__sleep()</link> e
<link linkend="object.wakeup">__wakeup()</link>. Usar
o método <link linkend="object.sleep">__sleep()</link> também lhe permitirá
serializar somente subconjuntos de propriedades de um objeto.
</para>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->