|
1 | 1 | <?xml version="1.0" encoding="utf-8"?> |
2 | 2 | <!-- $Revision$ --> |
3 | | -<!-- EN-Revision: 5e15a6c3e4d5819102361ae78e73c90a06238c8a Maintainer: hirokawa Status: ready --> |
| 3 | +<!-- EN-Revision: 8f51247cb4631b29686f867bd904dfe5b2678074 Maintainer: hirokawa Status: ready --> |
4 | 4 | <!-- CREDITS: shimooka,mumumu --> |
5 | 5 |
|
6 | 6 | <sect1 xml:id="language.oop5.magic" xmlns="http://docbook.org/ns/docbook"> |
|
29 | 29 | <link linkend="object.set">__set()</link>, |
30 | 30 | <link linkend="object.isset">__isset()</link>, |
31 | 31 | <link linkend="object.unset">__unset()</link>, |
32 | | - <link linkend="object.sleep">__sleep()</link>, |
33 | | - <link linkend="object.wakeup">__wakeup()</link>, |
34 | 32 | <link linkend="object.serialize">__serialize()</link>, |
35 | 33 | <link linkend="object.unserialize">__unserialize()</link>, |
| 34 | + <link linkend="object.sleep">__sleep()</link>, |
| 35 | + <link linkend="object.wakeup">__wakeup()</link>, |
36 | 36 | <link linkend="object.tostring">__toString()</link>, |
37 | 37 | <link linkend="object.invoke">__invoke()</link>, |
38 | 38 | <link linkend="object.set-state">__set_state()</link>, |
|
71 | 71 | </para> |
72 | 72 | </warning> |
73 | 73 |
|
74 | | - <sect2 xml:id="language.oop5.magic.sleep"> |
75 | | - <title> |
76 | | - <link linkend="object.sleep">__sleep()</link> と |
77 | | - <link linkend="object.wakeup">__wakeup()</link> |
78 | | - </title> |
79 | | - |
80 | | - <methodsynopsis xml:id="object.sleep"> |
81 | | - <modifier>public</modifier> <type>array</type><methodname>__sleep</methodname> |
82 | | - <void/> |
83 | | - </methodsynopsis> |
84 | | - <methodsynopsis xml:id="object.wakeup"> |
85 | | - <modifier>public</modifier> <type>void</type><methodname>__wakeup</methodname> |
86 | | - <void/> |
87 | | - </methodsynopsis> |
88 | | - |
89 | | - <para> |
90 | | - <function>serialize</function> は、クラスに特殊な名前 |
91 | | - <link linkend="object.sleep">__sleep()</link> の関数があるかどうかを調べます。 |
92 | | - もしあれば、シリアル化の前にその関数を実行します。 |
93 | | - この関数で、オブジェクトをクリアすることができます。 |
94 | | - またこの関数は、シリアル化するオブジェクトについて、 |
95 | | - すべての変数の名前を配列で返すことが前提となっています。 |
96 | | - このメソッドが何も返さなかった場合は、&null; |
97 | | - がシリアル化され、<constant>E_NOTICE</constant> が発生します。 |
98 | | - </para> |
99 | | - <note> |
100 | | - <para> |
101 | | - <link linkend="object.sleep">__sleep()</link> で、親クラスの private |
102 | | - プロパティの名前を返すことはできません。 |
103 | | - そうしようとすると <constant>E_NOTICE</constant> レベルのエラーとなります。 |
104 | | - この場合は、<link linkend="object.serialize">__serialize()</link> を代わりに使って下さい。 |
105 | | - </para> |
106 | | - </note> |
107 | | - <note> |
108 | | - <para> |
109 | | - PHP 8.0.0 以降では、 |
110 | | - <link linkend="object.sleep">__sleep()</link> から配列でない値を返すと、 |
111 | | - E_WARNING が発生するようになりました。これより前のバージョンでは、 |
112 | | - E_NOTICE が発生していました。 |
113 | | - </para> |
114 | | - </note> |
115 | | - <para> |
116 | | - 典型的な <link linkend="object.sleep">__sleep()</link> の使用法は、 |
117 | | - 途中のデータをコミットしたり、 |
118 | | - 似たようなタスクのクリアを行うといったものです。 |
119 | | - また、オブジェクトが非常に大きく、かつ、完全に保存する必要がない場合、 |
120 | | - この関数が有用です。 |
121 | | - </para> |
122 | | - <para> |
123 | | - 逆に、<function>unserialize</function> は、 |
124 | | - 特殊な名前 <link linkend="object.wakeup">__wakeup()</link> を有する |
125 | | - 関数の存在を調べます。 |
126 | | - もし存在する場合、この関数は、オブジェクトが有する可能性が |
127 | | - あるあらゆるリソースを再構築することができます。 |
128 | | - </para> |
129 | | - <para> |
130 | | - <link linkend="object.wakeup">__wakeup()</link> の使用目的は、 |
131 | | - シリアル化の際に失われたデータベース接続を再度確立したり、 |
132 | | - その他の再初期化を行うことです。 |
133 | | - </para> |
134 | | - <example> |
135 | | - <title>sleep と wakeup</title> |
136 | | - <programlisting role="php"> |
137 | | -<![CDATA[ |
138 | | -<?php |
139 | | -class Connection |
140 | | -{ |
141 | | - protected $link; |
142 | | - private $dsn, $username, $password; |
143 | | - |
144 | | - public function __construct($dsn, $username, $password) |
145 | | - { |
146 | | - $this->dsn = $dsn; |
147 | | - $this->username = $username; |
148 | | - $this->password = $password; |
149 | | - $this->connect(); |
150 | | - } |
151 | | - |
152 | | - private function connect() |
153 | | - { |
154 | | - $this->link = new PDO($this->dsn, $this->username, $this->password); |
155 | | - } |
156 | | - |
157 | | - public function __sleep() |
158 | | - { |
159 | | - return array('dsn', 'username', 'password'); |
160 | | - } |
161 | | - |
162 | | - public function __wakeup() |
163 | | - { |
164 | | - $this->connect(); |
165 | | - } |
166 | | -}?> |
167 | | -]]> |
168 | | - </programlisting> |
169 | | - </example> |
170 | | - </sect2> |
171 | | - |
172 | 74 | <sect2 xml:id="language.oop5.magic.serialize"> |
173 | 75 | <title> |
174 | 76 | <link linkend="object.serialize">__serialize()</link> と |
@@ -273,6 +175,114 @@ class Connection |
273 | 175 | </example> |
274 | 176 | </sect2> |
275 | 177 |
|
| 178 | + <sect2 xml:id="language.oop5.magic.sleep"> |
| 179 | + <title> |
| 180 | + <link linkend="object.sleep">__sleep()</link> と |
| 181 | + <link linkend="object.wakeup">__wakeup()</link> |
| 182 | + </title> |
| 183 | + |
| 184 | + <warning> |
| 185 | + <simpara> |
| 186 | + このシリアル化の仕組みは、PHP 8.5.0 以降 soft-deprecated 扱いになりました。 |
| 187 | + 後方互換性のために維持されていますが、新規コードおよび既存コードは、代わりに |
| 188 | + <link linkend="object.serialize">__serialize()</link> と |
| 189 | + <link linkend="object.unserialize">__unserialize()</link> |
| 190 | + マジックメソッドを使うように移行すべきです。 |
| 191 | + </simpara> |
| 192 | + </warning> |
| 193 | + |
| 194 | + <methodsynopsis xml:id="object.sleep"> |
| 195 | + <modifier>public</modifier> <type>array</type><methodname>__sleep</methodname> |
| 196 | + <void/> |
| 197 | + </methodsynopsis> |
| 198 | + <methodsynopsis xml:id="object.wakeup"> |
| 199 | + <modifier>public</modifier> <type>void</type><methodname>__wakeup</methodname> |
| 200 | + <void/> |
| 201 | + </methodsynopsis> |
| 202 | + |
| 203 | + <para> |
| 204 | + <function>serialize</function> は、クラスに特殊な名前 |
| 205 | + <link linkend="object.sleep">__sleep()</link> の関数があるかどうかを調べます。 |
| 206 | + もしあれば、シリアル化の前にその関数を実行します。 |
| 207 | + この関数で、オブジェクトをクリアすることができます。 |
| 208 | + またこの関数は、シリアル化するオブジェクトについて、 |
| 209 | + すべての変数の名前を配列で返すことが前提となっています。 |
| 210 | + このメソッドが何も返さなかった場合は、&null; |
| 211 | + がシリアル化され、<constant>E_NOTICE</constant> が発生します。 |
| 212 | + </para> |
| 213 | + <note> |
| 214 | + <para> |
| 215 | + <link linkend="object.sleep">__sleep()</link> で、親クラスの private |
| 216 | + プロパティの名前を返すことはできません。 |
| 217 | + そうしようとすると <constant>E_NOTICE</constant> レベルのエラーとなります。 |
| 218 | + この場合は、<link linkend="object.serialize">__serialize()</link> を代わりに使って下さい。 |
| 219 | + </para> |
| 220 | + </note> |
| 221 | + <note> |
| 222 | + <para> |
| 223 | + PHP 8.0.0 以降では、 |
| 224 | + <link linkend="object.sleep">__sleep()</link> から配列でない値を返すと、 |
| 225 | + E_WARNING が発生するようになりました。これより前のバージョンでは、 |
| 226 | + E_NOTICE が発生していました。 |
| 227 | + </para> |
| 228 | + </note> |
| 229 | + <para> |
| 230 | + 典型的な <link linkend="object.sleep">__sleep()</link> の使用法は、 |
| 231 | + 途中のデータをコミットしたり、 |
| 232 | + 似たようなタスクのクリアを行うといったものです。 |
| 233 | + また、オブジェクトが非常に大きく、かつ、完全に保存する必要がない場合、 |
| 234 | + この関数が有用です。 |
| 235 | + </para> |
| 236 | + <para> |
| 237 | + 逆に、<function>unserialize</function> は、 |
| 238 | + 特殊な名前 <link linkend="object.wakeup">__wakeup()</link> を有する |
| 239 | + 関数の存在を調べます。 |
| 240 | + もし存在する場合、この関数は、オブジェクトが有する可能性が |
| 241 | + あるあらゆるリソースを再構築することができます。 |
| 242 | + </para> |
| 243 | + <para> |
| 244 | + <link linkend="object.wakeup">__wakeup()</link> の使用目的は、 |
| 245 | + シリアル化の際に失われたデータベース接続を再度確立したり、 |
| 246 | + その他の再初期化を行うことです。 |
| 247 | + </para> |
| 248 | + <example> |
| 249 | + <title>sleep と wakeup</title> |
| 250 | + <programlisting role="php"> |
| 251 | +<![CDATA[ |
| 252 | +<?php |
| 253 | +class Connection |
| 254 | +{ |
| 255 | + protected $link; |
| 256 | + private $dsn, $username, $password; |
| 257 | +
|
| 258 | + public function __construct($dsn, $username, $password) |
| 259 | + { |
| 260 | + $this->dsn = $dsn; |
| 261 | + $this->username = $username; |
| 262 | + $this->password = $password; |
| 263 | + $this->connect(); |
| 264 | + } |
| 265 | +
|
| 266 | + private function connect() |
| 267 | + { |
| 268 | + $this->link = new PDO($this->dsn, $this->username, $this->password); |
| 269 | + } |
| 270 | +
|
| 271 | + public function __sleep() |
| 272 | + { |
| 273 | + return array('dsn', 'username', 'password'); |
| 274 | + } |
| 275 | +
|
| 276 | + public function __wakeup() |
| 277 | + { |
| 278 | + $this->connect(); |
| 279 | + } |
| 280 | +}?> |
| 281 | +]]> |
| 282 | + </programlisting> |
| 283 | + </example> |
| 284 | + </sect2> |
| 285 | + |
276 | 286 | <sect2 xml:id="language.oop5.magic.tostring"> |
277 | 287 | <title><link linkend="object.tostring">__toString()</link></title> |
278 | 288 | <methodsynopsis xml:id="object.tostring"> |
|
0 commit comments