mirror of
https://github.com/php/doc-ru.git
synced 2026-03-26 16:52:12 +01:00
112 lines
5.1 KiB
XML
112 lines
5.1 KiB
XML
<?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
|
||
-->
|