-
Notifications
You must be signed in to change notification settings - Fork 51
Expand file tree
/
Copy pathserialization.xml
More file actions
119 lines (104 loc) · 3.99 KB
/
Copy pathserialization.xml
File metadata and controls
119 lines (104 loc) · 3.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 70f392045a26b176f206013f00fa14b86440efd1 Maintainer: simp Status: ready -->
<sect1 xml:id="language.oop5.serialization" xmlns="http://docbook.org/ns/docbook">
<title>Serialisierung von Objekten - Objekte in Sessions</title>
<titleabbrev>Serialisierung von Objekten</titleabbrev>
<para>
<function>serialize</function> erzeugt einen String, welcher
die Byte-Stream-Repräsentation eines jeden Wertes besitzt,
der in PHP gespeichert werden kann.
<function>unserialize</function> kann diesen String verwenden,
um die ursprünglichen Variablenwerte wiederherzustellen. Verwendet
man <function>serialize</function>, um ein Objekt zu speichern,
so werden alle Variablen dieses Objektes gespeichert. Die
Methoden des Objektes werden nicht gespeichert, nur der Name
der Klasse.
</para>
<para>
Damit man imstande ist, ein Objekt mit <function>unserialize</function>
wiederherzustellen, muss die Klasse des Objektes definiert sein.
Das heißt, wenn man ein Objekt der Klasse A serialisiert, erhält man
einen String, der sich auf die Klasse A bezieht und die Werte
aller darin enthaltenen Variablen beinhaltet. Wenn man in einer
anderen Datei diesen String wieder zu einem Objekt der Klasse A
deserialisieren will, so muss die Klasse A in dieser Datei
vorher bekannt sein. Dies kann man erreichen, indem man die
Definition der Klasse A in eine mittels include
ladbare Datei auslagert und diese Datei einbindet oder die Funktion
<function>spl_autoload_register</function> verwendet.
</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 irgendwo ablegen, wo page2.php dies finden kann.
file_put_contents('store', $s);
// page2.php:
// Dies ist nötig, damit unserialize korrekt funktioniert.
include "A.php";
$s = file_get_contents('store');
$a = unserialize($s);
// Nun kann man die Funktion show_one() des Objektes $a
// verwenden.
$a->show_one();
?>
]]>
</programlisting>
</informalexample>
<para>
Es ist dringend empfohlen, dass wenn eine Anwendung Objekte zur späteren
Verwendung in der Anwendung serialisiert, die Klassendefinitionen in
der gesamten Anwendung eingebunden werden. Wird dies nicht beachtet, so
wird das Objekt ohne eine Klassendefinition deserialisiert, was dazu
führen wird, dass PHP dem Objekt eine Klasse
<classname>__PHP_Incomplete_Class_Name</classname> zuweisen wird, welche
keine Methoden besitzt. Dies wird das Objekt nutzlos machen.
</para>
<para>
Wenn also im obigen Beispiel <varname>$a</varname> Teil einer Session würde,
indem ein neuer Schlüssel zum superglobalen Array <varname>$_SESSION</varname>
hinzugefügt wird, dann sollte die Datei <literal>A.php</literal> in jeder
Seite eingebunden werden, nicht nur in <filename>page1.php</filename> und
<filename>page2.php</filename>.
</para>
<para>
Beachten Sie neben den obigen Hinweisen dass man sich in die Serialisierungs-
und Deserialisierungs-Ereignisse einklinken kann, indem man die Methoden
<link linkend="object.sleep">__sleep()</link> und
<link linkend="object.wakeup">__wakeup()</link> eines Objektes verwendet.
Die Verwendung von <link linkend="object.sleep">__sleep()</link> erlaubt es
nur eine Teilmenge der Eigenschaften eines Objektes zu serialisieren.
</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
-->