svn: /phpdoc/ja/trunk/ language/oop5/magic.xml reference/var/functions/serialize.xml reference/var/functions/unserialize.xml

[email protected] (Yoshinari Takaoka)
Newsgroups php.doc.ja
Message-ID <[email protected]>
mumumu                                   Thu, 02 Apr 2020 05:26:31 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=349591

Log:
Document the __serialize/__unserialize magic in PHP 7.4

Changed paths:
    U   phpdoc/ja/trunk/language/oop5/magic.xml
    U   phpdoc/ja/trunk/reference/var/functions/serialize.xml
    U   phpdoc/ja/trunk/reference/var/functions/unserialize.xml
svn-diffs-349591.txt (text/x-diff, 10.1 KB)
Modified: phpdoc/ja/trunk/language/oop5/magic.xml
===================================================================
--- phpdoc/ja/trunk/language/oop5/magic.xml	2020-04-01 23:15:30 UTC (rev 349590)
+++ phpdoc/ja/trunk/language/oop5/magic.xml	2020-04-02 05:26:31 UTC (rev 349591)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 349020 Maintainer: hirokawa Status: ready -->
+<!-- EN-Revision: 349590 Maintainer: hirokawa Status: ready -->
 <!-- CREDITS: shimooka,mumumu -->

 <sect1 xml:id="language.oop5.magic" xmlns="http://docbook.org/ns/docbook">
@@ -17,6 +17,8 @@
    <link linkend="object.unset">__unset()</link>,
    <link linkend="object.sleep">__sleep()</link>,
    <link linkend="object.wakeup">__wakeup()</link>,
+   <link linkend="object.serialize">__serialize()</link>,
+   <link linkend="object.unserialize">__unserialize()</link>,
    <link linkend="object.tostring">__toString()</link>,
    <link linkend="object.invoke">__invoke()</link>,
    <link linkend="object.set-state">__set_state()</link>,
@@ -54,7 +56,7 @@
     <void/>
    </methodsynopsis>
    <methodsynopsis xml:id="object.wakeup">
-    <type>void</type><methodname>__wakeup</methodname>
+    <modifier>public</modifier> <type>void</type><methodname>__wakeup</methodname>
     <void/>
    </methodsynopsis>

@@ -132,6 +134,110 @@
 ]]>
     </programlisting>
    </example>
+  </sect2>
+
+  <sect2 xml:id="language.oop5.magic.serialize">
+   <title>
+    <link linkend="object.serialize">__serialize()</link> と
+    <link linkend="object.unserialize">__unserialize()</link>
+   </title>
+
+   <methodsynopsis xml:id="object.serialize">
+    <modifier>public</modifier> <type>array</type><methodname>__serialize</methodname>
+    <void/>
+   </methodsynopsis>
+   <methodsynopsis xml:id="object.unserialize">
+    <modifier>public</modifier> <type>void</type><methodname>__unserialize</methodname>
+    <methodparam><type>array</type><parameter>data</parameter></methodparam>
+   </methodsynopsis>
+
+   <para>
+    <function>serialize</function> は、クラスが
+    特殊な名前 <link linkend="object.serialize">__serialize()</link> を持つかを調べます。
+    もしあれば、シリアル化の前にその関数を実行します。
+    この関数は、オブジェクトをシリアル化した状態を示すキー/値のペアを連想配列にして返さなければなりません。
+    配列を返さなかった場合、<classname>TypeError</classname> がスローされます。
+   </para>
+   <note>
+    <para>
+     <link linkend="object.serialize">__serialize()</link> と <link linkend="object.sleep">__sleep()</link>
+     が両方同じオブジェクトに定義されていた場合、
+     <link linkend="object.serialize">__serialize()</link> だけが呼び出されます。
+     <link linkend="object.sleep">__sleep()</link> は無視されます。
+     オブジェクトが <link linkend="class.serializable">Serializable</link>
+     インターフェイスを実装していた場合、
+     インターフェイスの <literal>serialize()</literal> メソッドは無視され、
+     <link linkend="object.serialize">__serialize()</link> が代わりに使われます。
+    </para>
+   </note>
+   <para>
+    <link linkend="object.serialize">__serialize()</link> の目的は、
+    任意のオブジェクトの表現をシリアライズしやすいように定義することです。
+    配列の要素はオブジェクトのプロパティに対応していても構いませんが、必須ではありません。
+   </para>
+   <para>
+    逆に、<function>unserialize</function> は
+    特殊な名前 <link linkend="object.serialize">__unserialize()</link> を持つかを調べます。
+    もしあれば、<link linkend="object.serialize">__serialize()</link> が返した配列を復元し、この関数に渡します。
+    この関数では、その配列から必要に応じてオブジェクトのプロパティを復元して構いません。
+   </para>
+   <note>
+    <para>
+     <link linkend="object.unserialize">__unserialize()</link> と <link linkend="object.wakeup">__wakeup()</link>
+     が両方同じオブジェクトに定義されていた場合、
+     <link linkend="object.unserialize">__unserialize()</link> だけが呼び出されます。
+     <link linkend="object.wakeup">__wakeup()</link> は無視されます。
+    </para>
+   </note>
+   <note>
+    <para>
+     この機能は PHP 7.4.0 以降で利用できます。
+    </para>
+   </note>
+   <example>
+    <title>Serialize および unserialize</title>
+    <programlisting role="php">
+<![CDATA[
+<?php
+class Connection
+{
+    protected $link;
+    private $dsn, $username, $password;
+
+    public function __construct($dsn, $username, $password)
+    {
+        $this->dsn = $dsn;
+        $this->username = $username;
+        $this->password = $password;
+        $this->connect();
+    }
+
+    private function connect()
+    {
+        $this->link = new PDO($this->dsn, $this->username, $this->password);
+    }
+
+    public function __serialize(): array
+    {
+        return [
+          'dsn' => $this->dsn,
+          'user' => $this->username,
+          'pass' => $this->password,
+        ];
+    }
+
+    public function __unserialize(array $data): void
+    {
+        $this->dsn = $data['dsn'];
+        $this->username = $data['user'];
+        $this->password = $data['pass'];
+
+        $this->connect();
+    }
+}?>
+]]>
+    </programlisting>
+   </example>
  </sect2>

  <sect2 xml:id="language.oop5.magic.tostring">

Modified: phpdoc/ja/trunk/reference/var/functions/serialize.xml
===================================================================
--- phpdoc/ja/trunk/reference/var/functions/serialize.xml	2020-04-01 23:15:30 UTC (rev 349590)
+++ phpdoc/ja/trunk/reference/var/functions/serialize.xml	2020-04-02 05:26:31 UTC (rev 349591)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 346043 Maintainer: hirokawa Status: ready -->
-<!-- CREDITS: takagi -->
+<!-- EN-Revision: 349590 Maintainer: hirokawa Status: ready -->
+<!-- CREDITS: takagi,mumumu -->
 <refentry xml:id="function.serialize" xmlns="http://docbook.org/ns/docbook">
  <refnamediv>
   <refname>serialize</refname>
@@ -43,11 +43,12 @@
        循環参照も保存されます。その他の参照は失われます。
       </para>
       <para>
-       PHP は、シリアル化の前にまずメンバ関数 <link linkend="object.sleep">__sleep()</link>
+       PHP は、シリアル化の前にまずメンバ関数
+       <link linkend="object.serialize">__serialize()</link> または <link linkend="object.sleep">__sleep()</link>
        のコールを試みます。ここで、シリアル化の前のオブジェクトの後始末処理
        などを行います。同様に、<function>unserialize</function> で
        オブジェクトを復元した際にはメンバ関数
-       <link linkend="object.wakeup">__wakeup()</link> がコールされます。
+       <link linkend="object.unserialize">__unserialize()</link> または <link linkend="object.wakeup">__wakeup()</link> がコールされます。
       </para>
       <note>
        <para>
@@ -112,8 +113,8 @@
    <para>
     PHP の組み込みオブジェクトの多くはシリアル化できないことに注意しましょう。しかし、
     <interfacename>Serializable</interfacename> インターフェイスを実装しているか、あるいはマジックメソッド
-    <link linkend="object.sleep">__sleep()</link> および
-    <link linkend="object.wakeup">__wakeup()</link>
+    <link linkend="object.serialize">__serialize()</link>/<link linkend="object.unserialize">__unserialize()</link>
+    または <link linkend="object.sleep">__sleep()</link>/<link linkend="object.wakeup">__wakeup()</link>
     を実装していればシリアル化することができます。
     内部クラスがこれらの要件を満たしていない場合は、確実にシリアル化することはできません。
    </para>
@@ -142,6 +143,8 @@
     <member><link linkend="language.oop5.serialization">オブジェクトのシリアル化</link></member>
     <member><link linkend="object.sleep">__sleep()</link></member>
     <member><link linkend="object.wakeup">__wakeup()</link></member>
+    <member><link linkend="object.serialize">__serialize()</link></member>
+    <member><link linkend="object.unserialize">__unserialize()</link></member>
    </simplelist>
   </para>
  </refsect1>

Modified: phpdoc/ja/trunk/reference/var/functions/unserialize.xml
===================================================================
--- phpdoc/ja/trunk/reference/var/functions/unserialize.xml	2020-04-01 23:15:30 UTC (rev 349590)
+++ phpdoc/ja/trunk/reference/var/functions/unserialize.xml	2020-04-02 05:26:31 UTC (rev 349591)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 349581 Maintainer: hirokawa Status: ready -->
+<!-- EN-Revision: 349590 Maintainer: hirokawa Status: ready -->
 <!-- Credits: mumumu -->
 <refentry xml:id="function.unserialize" xmlns="http://docbook.org/ns/docbook">
  <refnamediv>
@@ -53,7 +53,7 @@
       <para>
        もしアンシリアライズする変数がオブジェクトの場合、
        オブジェクトが無事再作成された後、PHP は自動的にメンバ関数
-       <link linkend="object.wakeup">__wakeup()</link>
+       <link linkend="object.unserialize">__unserialize()</link> または <link linkend="object.wakeup">__wakeup()</link>
        (存在していれば) をコールしようとします。
       </para>
       <para>
@@ -251,6 +251,8 @@
     <member><link linkend="language.oop5.autoload">クラスのオートローディング</link></member>
     <member><link linkend="unserialize-callback-func">unserialize_callback_func</link></member>
     <member><link linkend="object.wakeup">__wakeup()</link></member>
+    <member><link linkend="object.serialize">__serialize()</link></member>
+    <member><link linkend="object.unserialize">__unserialize()</link></member>
    </simplelist>
   </para>
  </refsect1>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.