1
0
mirror of https://github.com/php/doc-ja.git synced 2026-03-27 08:32:09 +01:00
Files
archived-doc-ja/language/oop5/serialization.xml

114 lines
4.4 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- TODO Rewrite to remove usage of "you" and talk about __serialize/_unserialize -->
<!-- EN-Revision: 70f392045a26b176f206013f00fa14b86440efd1 Maintainer: takagi Status: ready -->
<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> するには、
そのオブジェクトのクラスが定義されている必要があります。
A クラスのオブジェクトをシリアライズしたのなら、
その文字列にはクラス A とその中のすべての変数の値が含まれています。
別のファイルでそれを復元してクラス A のオブジェクトを取り出すには、
まずそのファイル内にクラス A の定義が存在しなければなりません。
これを実現するには、たとえばクラス A の定義を別ファイルに書き出してそれを
include したり <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:
// シリアライズした文字列を復元するには、これが必要です
include "A.php";
$s = file_get_contents('store');
$a = unserialize($s);
// これで、$a オブジェクトの show_one() が使えるようになりました
$a->show_one();
?>
]]>
</programlisting>
</informalexample>
<para>
アプリケーション内でオブジェクトをシリアライズして再利用する場合のお勧めは、
そのクラスの定義をアプリケーション全体で include することです。
クラスの定義が存在しなければオブジェクトの復元に失敗してしまいます。
その場合、PHP は <classname>__PHP_Incomplete_Class_Name</classname>
クラスのオブジェクトを返します。このオブジェクトにはメソッドは一切なく、
使い道がなくなってしまいます。
</para>
<para>
つまり、もし上の例の <varname>$a</varname>
スーパーグローバル <varname>$_SESSION</varname>
に新しいキーを追加してセッションに格納するなら、
<filename>page1.php</filename><filename>page2.php</filename> だけではなく
すべてのページで <literal>A.php</literal> を include しなければなりません。
</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
-->