1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-26 16:52:12 +01:00
Files
archived-doc-ru/language/oop5/serialization.xml
2024-04-24 06:08:11 +03:00

112 lines
5.1 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 70f392045a26b176f206013f00fa14b86440efd1 Maintainer: mch Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.oop5.serialization" xmlns="http://docbook.org/ns/docbook">
<title>Сериализация объектов — сохранение объектов между сессиями</title>
<titleabbrev>Сериализация объектов</titleabbrev>
<para>
Функция <function>serialize</function> возвращает
строковое представление любого значения, которое может быть сохранено в
PHP. Функция <function>unserialize</function> может использовать эту строку для
восстановления исходного значения переменной. Использование сериализации для
сохранения объекта сохранит все его переменные. Методы в объекте не будут сохранены,
только имя класса.
</para>
<para>
Чтобы десериализовать объект функцией <function>unserialize</function>,
необходимо заранее определить класс этого объекта. То есть, если
есть экземпляр класса А, и он будет сериализован,
будет получено его строковое представление,
которое содержит значение всех переменных, содержащихся в нем.
Чтобы восстановить объект из строки в другом PHP-файле,
класс A должен быть определён в этом файле заранее.
Это можно сделать, например, путём сохранения определения класса A в отдельном файле
и подключения этого файла или вызовом функции
<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);
// сохраняем $s где-нибудь, откуда page2.php сможет его получить.
file_put_contents('store', $s);
// page2.php:
// это нужно для того, чтобы функция unserialize работала правильно.
include "A.php";
$s = file_get_contents('store');
$a = unserialize($s);
// теперь можно использовать метод show_one() объекта $a.
$a->show_one();
?>
]]>
</programlisting>
</informalexample>
<para>
Если в приложении сериализуются объекты, которые будут использованы в приложении позже,
следуют строгой рекомендации — подключать определение класса
для этого объекта во всём приложении. При невыполнении этого требования десериализация объекта
пройдёт и без определения класса, но PHP назначит этому объекту
класс <classname>__PHP_Incomplete_Class_Name</classname>,
у которого нет методов, и сделает объект бесполезным.
</para>
<para>
Поэтому, как в примере выше, если переменная <varname>$a</varname> стала частью сессии
путём добавления нового ключа в суперглобальный массив <varname>$_SESSION</varname>,
нужно подключать файл <literal>A.php</literal> на всех страницах,
а не только на страницах <filename>page1.php</filename> и <filename>page2.php</filename>.
</para>
<para>
Обратите внимание, что, кроме уже приведённого совета, можно подключиться к событиям
сериализации и десериализации объекта через методы
<link linkend="object.sleep">__sleep()</link>
и <link linkend="object.wakeup">__wakeup()</link>.
В методе <link linkend="object.sleep">__sleep()</link>
можно управлять тем, какие свойства объекта будут сериализованы.
</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
-->