-
Notifications
You must be signed in to change notification settings - Fork 43
/
Copy pathcloning.xml
183 lines (156 loc) · 4.23 KB
/
cloning.xml
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 28529d3539b850e870e3aa97570f4db0e53daa03 Maintainer: simp Status: ready -->
<sect1 xml:id="language.oop5.cloning" xmlns="http://docbook.org/ns/docbook">
<title>Objekte klonen</title>
<para>
Eine Kopie eines Objektes mit vollständig replizierten Eigenschaften zu
erzeugen, ist nicht immer das gewünschte Verhalten. Ein gutes Beispiel für
die Notwendigkeit von Kopierkonstruktoren ist ein Objekt, welches ein GTK
Fenster repräsentiert und dieses Objekt enthält die Ressource des GTK-Fensters.
Wenn Sie ein Duplikat dieses Objektes erzeugen, könnten Sie
ein neues Fenster mit gleichen Eigenschaften erzeugen wollen und das neue
Objekt soll die Ressource des neuen Fensters speichern.
Ein weiteres Beispiel ist ein Objekt, welches eine Referenz auf ein anderes
Objekt, das es benutzt, hält und wenn das Vaterobjekt repliziert wird, will
man eine neue Instanz dieses anderen Objektes erzeugen, damit das Replikat
eine eigene Kopie besitzt.
</para>
<para>
Eine Objektkopie wird durch die Nutzung des <emphasis>clone</emphasis>
Schlüsselwortes (welches wenn möglich die
<link linkend="object.clone">__clone()</link>-Methode des Objektes aufruft)
erzeugt.
</para>
<informalexample>
<programlisting>
<![CDATA[
$kopie_des_objektes = clone $objekt;
]]>
</programlisting>
</informalexample>
<para>
Wenn ein Objekt geklont wird, wird PHP eine seichte Kopie der Eigenschaften
des Objektes durchführen. Alle Eigenschaften, die Referenzen auf andere
Variablen sind, werden Referenzen bleiben.
</para>
<methodsynopsis xml:id="object.clone">
<type>void</type><methodname>__clone</methodname>
<void/>
</methodsynopsis>
<para>
Sobald der Klonvorgang abgeschlossen und eine <link linkend="object.clone">__clone()</link>-
Methode definiert ist, so wird die <link linkend="object.clone">__clone()</link>-Methode
des neu erzeugten Objekts aufgerufen, damit alle notwendigen Eigenschaften verändert werden
können.
</para>
<example>
<title>Ein Objekt klonen</title>
<programlisting role="php">
<![CDATA[
<?php
class SubObject
{
static $instanzen = 0;
public $instanz;
public function __construct() {
$this->instanz = ++self::$instanzen;
}
public function __clone() {
$this->instanz = ++self::$instanzen;
}
}
class MyCloneable
{
public $objekt1;
public $objekt2;
function __clone()
{
// Erzwinge eine Kopie von this->object,
// andernfalls wird es auf das selbe Objekt zeigen
$this->objekt1 = clone $this->objekt1;
}
}
$obj = new MyCloneable();
$obj->objekt1 = new SubObject();
$obj->objekt2 = new SubObject();
$obj2 = clone $obj;
print "Original Objekt:\n";
print_r($obj);
print "geklontes Objekt:\n";
print_r($obj2);
?>
]]>
</programlisting>
&example.outputs;
<screen role="php">
<![CDATA[
Original Objekt:
MyCloneable Object
(
[object1] => SubObject Object
(
[instanz] => 1
)
[object2] => SubObject Object
(
[instanz] => 2
)
)
geklontes Object:
MyCloneable Object
(
[objekt1] => SubObject Object
(
[instanz] => 3
)
[objekt2] => SubObject Object
(
[instanz] => 2
)
)
]]>
</screen>
</example>
<para>
Es ist möglich, auf die Klassenelemente eines soeben
geklonten Objekts in einem einzigen Ausdruck zuzugreifen:
</para>
<example>
<title>Zugriff auf ein Element eines soeben geklonten Objekts</title>
<programlisting role="php">
<![CDATA[
<?php
$dateTime = new DateTime();
echo (clone $dateTime)->format('Y');
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
2016
]]>
</screen>
</example>
</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
-->