1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-24 07:22:16 +01:00
Files
archived-doc-es/language/oop5/serialization.xml
2025-05-06 21:45:14 +02:00

114 lines
3.9 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 70f392045a26b176f206013f00fa14b86440efd1 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<!-- TODO Rewrite to remove usage of "you" and talk about __serialize/_unserialize -->
<sect1 xml:id="language.oop5.serialization" xmlns="http://docbook.org/ns/docbook">
<title>Serializar objetos - objetos en sesión</title>
<titleabbrev>Serialización de objetos</titleabbrev>
<para>
<function>serialize</function> devuelve un string que contiene
una representación lineal de cualquier valor que
puede ser almacenado en PHP. <function>unserialize</function> puede utilizar este
string para recrear el valor original de la variable a partir de su representación lineal. Utilizar <function>serialize</function>
para guardar un objeto conservará todas sus variables. Sus métodos no serán conservados, solo el nombre de la clase lo será.
</para>
<para>
Para poder deserializar (<function>unserialize</function>) un objeto,
la clase del objeto debe estar definida, para permitir su reconstrucción.
En otras palabras, si se tiene un objeto de la clase A y se serializa,
la representación lineal obtenida hará referencia a la clase A y contendrá todas
sus variables. Si se desea poder deserializar esta representación lineal en un
lugar donde la clase A no esté definida (en otro fichero, por ejemplo),
entonces se deberá redclarar la clase A antes de proceder a la deserialización
de su representación lineal. Esto puede hacerse, por ejemplo, incluyendo el
fichero de definición de la clase, o utilizando la función
<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);
// guarda $s en algún lugar donde page2.php pueda encontrarlo
file_put_contents('store', $s);
// page2.php :
// se necesita la definición de la clase
// para que unserialize() funcione
include "A.php";
$s = file_get_contents('store');
$a = unserialize($s);
// llamada a show_one() en el objeto $a, muestra 1
$a->show_one();
?>
]]>
</programlisting>
</informalexample>
<para>
Si una aplicación serializa objetos, se recomienda encarecidamente, para su uso
futuro, que la aplicación incluya las definiciones de las clases de los objetos serializados
en cada página. No hacerlo podría resultar en un objeto deserializado sin su definición
de clase. PHP asignaría entonces a este objeto una clase de tipo
<classname>__PHP_Incomplete_Class_Name</classname>, que no tiene métodos, y
produciría un objeto inútil.
</para>
<para>
Así, en el ejemplo anterior, si <varname>$a</varname> se registra en la sesión
añadiendo una clave a la variable superglobal <varname>$_SESSION</varname>, se debería incluir el fichero
<literal>A.php</literal> en todas las páginas, y no solo en
<filename>page1.php</filename> y <filename>page2.php</filename>.
</para>
<para>
Tenga en cuenta que también se pueden utilizar los eventos de serialización y deserialización
en un objeto utilizando los métodos <link linkend="object.sleep">__sleep()</link> y
<link linkend="object.wakeup">__wakeup()</link>. El uso de
<link linkend="object.sleep">__sleep()</link> permite también serializar solo una parte de las propiedades del 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
-->