<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.oop5.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'language.oop5.cloning.php',
    1 => 'Objekte klonen',
    2 => 'Objekte klonen',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Klassen und Objekte',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.final.php',
    1 => 'Final-Schl&uuml;sselwort',
  ),
  'next' => 
  array (
    0 => 'language.oop5.object-comparison.php',
    1 => 'Objekte vergleichen',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'language/oop5/cloning.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.cloning" class="sect1">
  <h2 class="title">Objekte klonen</h2>

  <p class="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.
  </p>

  <p class="para">
   Eine Objektkopie wird durch die Nutzung des <em>clone</em>
   Schlüsselwortes (welches wenn möglich die
   <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>-Methode des Objektes aufruft)
   erzeugt.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive cdata"><pre>
$kopie_des_objektes = clone $objekt;
</pre></div>
   </div>

  </div>

  <p class="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.
  </p>

  <div class="methodsynopsis dc-description" id="object.clone">
   <span class="methodname"><strong>__clone</strong></span>(): <span class="type"><a href="language.types.void.php" class="type void">void</a></span></div>


  <p class="para">
   Sobald der Klonvorgang abgeschlossen und eine <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>-
   Methode definiert ist, so wird die <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>-Methode
   des neu erzeugten Objekts aufgerufen, damit alle notwendigen Eigenschaften verändert werden
   können.
  </p>

  <div class="example" id="example-1">
   <p><strong>Beispiel #1 Ein Objekt klonen</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">SubObject<br /></span><span style="color: #007700">{<br />    static </span><span style="color: #0000BB">$instanzen </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />    public </span><span style="color: #0000BB">$instanz</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">instanz </span><span style="color: #007700">= ++</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$instanzen</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">__clone</span><span style="color: #007700">() {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">instanz </span><span style="color: #007700">= ++</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$instanzen</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">MyCloneable<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$objekt1</span><span style="color: #007700">;<br />    public </span><span style="color: #0000BB">$objekt2</span><span style="color: #007700">;<br /><br />    function </span><span style="color: #0000BB">__clone</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #FF8000">// Erzwinge eine Kopie von this-&gt;object,<br />        // andernfalls wird es auf das selbe Objekt zeigen<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">objekt1 </span><span style="color: #007700">= clone </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">objekt1</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyCloneable</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">objekt1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">SubObject</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">objekt2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">SubObject</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$obj2 </span><span style="color: #007700">= clone </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br /><br /><br />print </span><span style="color: #DD0000">"Original Objekt:\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">);<br /><br />print </span><span style="color: #DD0000">"geklontes Objekt:\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj2</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>Das oben gezeigte Beispiel erzeugt folgende Ausgabe:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Original Objekt:
MyCloneable Object
(
    [object1] =&gt; SubObject Object
        (
            [instanz] =&gt; 1
        )

    [object2] =&gt; SubObject Object
        (
            [instanz] =&gt; 2
        )

)
geklontes Object:
MyCloneable Object
(
    [objekt1] =&gt; SubObject Object
        (
            [instanz] =&gt; 3
        )

    [objekt2] =&gt; SubObject Object
        (
            [instanz] =&gt; 2
        )

)
</pre></div>

   </div>

  </div>

  <p class="para">
   Es ist möglich, auf die Klassenelemente eines soeben
   geklonten Objekts in einem einzigen Ausdruck zuzugreifen:
  </p>
  <div class="example" id="example-2">
   <p><strong>Beispiel #2 Zugriff auf ein Element eines soeben geklonten Objekts</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$dateTime </span><span style="color: #007700">= new </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">();<br />echo (clone </span><span style="color: #0000BB">$dateTime</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>Das oben gezeigte Beispiel erzeugt
eine ähnliche Ausgabe wie:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
2016
</pre></div>
   </div>
  </div>

 </div><?php manual_footer($setup); ?>