<?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.decon.php',
    1 => 'Konstruktoren und Destruktoren',
    2 => 'Konstruktoren und Destruktoren',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Klassen und Objekte',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.autoload.php',
    1 => 'Automatisches Laden von Klassen',
  ),
  'next' => 
  array (
    0 => 'language.oop5.visibility.php',
    1 => 'Sichtbarkeit',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'language/oop5/decon.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.decon" class="sect1">
  <h2 class="title">Konstruktoren und Destruktoren</h2>

  <div class="sect2" id="language.oop5.decon.constructor">
   <h3 class="title">Konstruktor</h3>
   <div class="methodsynopsis dc-description" id="object.construct">
    <span class="methodname"><strong>__construct</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span> <code class="parameter">...$values</code><span class="initializer"> = &quot;&quot;</span></span>): <span class="type"><a href="language.types.void.php" class="type void">void</a></span></div>

   <p class="para">
    PHP erlaubt es Entwicklern, Konstruktormethoden für Klassen zu deklarieren.
    Klassen mit Konstruktormethoden rufen diese für jedes neu erzeugte Objekt
    auf, sodass Konstruktoren für alle Initialisierungen passend sind, die das
    Objekt brauchen könnte, bevor es benutzt wird.
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     Konstruktoren von Elternklassen werden nicht implizit aufgerufen, wenn
     die Kindklasse einen Konstruktor definiert. Um einen Elternkonstruktor zu
     benutzen, ist ein Aufruf von <span class="function"><strong>parent::__construct()</strong></span>
     innerhalb des Kindkonstruktors notwendig. Falls das Kind keinen
     Konstruktor definiert, kann er von der Elternklasse genau wie eine
     normale Klassenmethode geerbt werden (falls er nicht als privat
     deklariert wurde).
    </span>
   </p></blockquote>
   <div class="example" id="example-1">
    <p><strong>Beispiel #1 Konstruktoren bei der Vererbung</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">BaseClass </span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {<br />        print </span><span style="color: #DD0000">"Im BaseClass-Konstruktor\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">SubClass </span><span style="color: #007700">extends </span><span style="color: #0000BB">BaseClass </span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">__construct</span><span style="color: #007700">();<br />        print </span><span style="color: #DD0000">"Im SubClass-Konstruktor\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">OtherSubClass </span><span style="color: #007700">extends </span><span style="color: #0000BB">BaseClass </span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// erbt den Konstruktor von BaseClass<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">// Im BaseClass-Konstruktor<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">BaseClass</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// Im BaseClass-Konstruktor<br />// Im SubClass-Konstruktor<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">SubClass</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// Im BaseClass-Konstruktor<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">OtherSubClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">
    Im Gegensatz zu anderen Methoden ist
    <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> ist ausgenommen von
    den üblichen
    <a href="language.oop5.basic.php#language.oop.lsp" class="link">Regeln für die Signaturkompatibilität</a>.
    wenn sie erweitert wird.
   </p>
   <p class="para">
    Konstruktoren sind gewöhnliche Methoden, die bei der Instanziierung des
    entsprechenden Objekts aufgerufen werden. Als solche können sie eine
    beliebige Anzahl von Argumenten definieren, die erforderlich sein können,
    einen Typ haben können und einen Standardwert haben können.
    Konstruktorargumente werden aufgerufen, indem die Argumente in Klammern
    hinter den Klassennamen gesetzt werden.
   </p>
   <div class="example" id="example-2">
    <p><strong>Beispiel #2 Die Verwendung von Argumenten eines Konstruktors</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">Punkt </span><span style="color: #007700">{<br />    protected </span><span style="color: #0000BB">int $x</span><span style="color: #007700">;<br />    protected </span><span style="color: #0000BB">int $y</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">int $x</span><span style="color: #007700">, </span><span style="color: #0000BB">int $y </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">x </span><span style="color: #007700">= </span><span style="color: #0000BB">$x</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">y </span><span style="color: #007700">= </span><span style="color: #0000BB">$y</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #FF8000">// Beide Parameter übergeben.<br /></span><span style="color: #0000BB">$p1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Punkt</span><span style="color: #007700">(</span><span style="color: #0000BB">4</span><span style="color: #007700">, </span><span style="color: #0000BB">5</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Nur den erforderlichen Parameter übergeben. $y nimmt den Standardwert von 0 an.<br /></span><span style="color: #0000BB">$p2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Punkt</span><span style="color: #007700">(</span><span style="color: #0000BB">4</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Mit benannten Parametern (von PHP 8.0 an):<br /></span><span style="color: #0000BB">$p3 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Punkt</span><span style="color: #007700">(</span><span style="color: #0000BB">y</span><span style="color: #007700">: </span><span style="color: #0000BB">5</span><span style="color: #007700">, </span><span style="color: #0000BB">x</span><span style="color: #007700">: </span><span style="color: #0000BB">4</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">
    Wenn eine Klasse keinen Konstruktor hat oder der Konstruktor keine
    erforderlichen Argumente hat, können die Klammern weggelassen werden.
   </p>
   <div class="sect3">
    <h4 class="title">Konstruktoren alten Stils</h4>
    <p class="para">
     Vor PHP 8.0.0 interpretieren Klassen im globalen Namensraum eine Methode,
     die den gleichen Namen wie die Klasse trägt, als Konstruktor alten Stils.
     Diese Syntax ist veraltet, und führt zu einem
     <strong><code><a href="errorfunc.constants.php#constant.e-deprecated">E_DEPRECATED</a></code></strong>-Fehler, ruft die Funktion aber trotzdem
     als Konstruktor auf. Wenn sowohl
     <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> als auch eine
     Methode gleichen Namens definiert sind, wird
     <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> aufgerufen.
    </p>
    <p class="para">
     In Namensraum-Klassen, oder ab PHP 8.0.0 in jeder Klasse, hat eine
     Methode mit dem Namen der Klasse keine besondere Bedeutung.
    </p>
    <p class="para">
     Verwenden Sie in neuem Code immer
     <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a>.
    </p>
   </div>
   <div class="sect3" id="language.oop5.decon.constructor.promotion">
    <h4 class="title">Promotion (Beförderung) des Konstruktors</h4>
    <p class="para">
     Ab PHP 8.0.0 können Konstruktorparameter auch so befördert werden, dass
     sie einer Objekteigenschaft entsprechen. Sehr häufig werden
     Konstruktorparameter einer Eigenschaft im Konstruktor zugewiesen, aber
     ansonsten nicht bearbeitet. Die Konstruktor-Promotion bietet eine
     Kurzform für diesen Anwendungsfall. Das obige Beispiel könnte wie folgt
     umgeschrieben werden:
    </p>
    <div class="example" id="example-3">
     <p><strong>Beispiel #3 Die Verwendung der Beförderung von Konstruktor-Eigenschaften</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">Punkt </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(protected </span><span style="color: #0000BB">int $x</span><span style="color: #007700">, protected </span><span style="color: #0000BB">int $y </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br />    }<br />}</span></span></code></div>
     </div>

    </div>
    <p class="para">
     Wenn ein Konstruktorargument einen Modifizierer enthält,
     interpretiert PHP es sowohl als Objekteigenschaft als auch als
     Konstruktorargument und weist der Eigenschaft den Wert des Arguments zu.
     Der Konstruktorkörper kann dann leer sein oder andere Anweisungen
     enthalten. Alle zusätzlichen Anweisungen werden ausgeführt, nachdem die
     Argumentwerte den entsprechenden Eigenschaften zugewiesen wurden.
    </p>
    <p class="para">
     Nicht alle Argumente müssen befördert werden. Beförderte und nicht
     beförderte Argumente können in beliebiger Reihenfolge zu kombiniert
     werden. Beförderte Argumente haben keinen Einfluss auf den Code, der den
     Konstruktor aufruft.
    </p>
    <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
     <p class="para">
      Eigenschaften werden wahrscheinlich meist mit einem
      <a href="language.oop5.visibility.php" class="link">Sichtbarkeitsmodifikator</a>
      (<code class="literal">public</code>, <code class="literal">protected</code> oder
      <code class="literal">private</code>) befördert, aber jeder andere einzelne
      Modifikator (z. B. <code class="literal">readonly</code>) hat denselben Effekt.
     </p>
    </p></blockquote>
    <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
     <p class="para">
      Objekteigenschaften dürfen aufgrund der Mehrdeutigkeit, die in die
      Engine einfließen würde, nicht mit <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> typisiert
      werden. Somit dürfen die angeführten Argumente auch nicht mit
      <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> typisiert werden. Jede andere
      <a href="language.types.declarations.php" class="link">Typ-Deklaration</a> ist
      jedoch erlaubt.
     </p>
    </p></blockquote>
    <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
     <p class="para">
      Da beförderte Eigenschaften sowohl zu einer Eigenschaft als auch zu
      einem Funktionsparameter gemacht werden, gelten alle
      Namensbeschränkungen sowohl für Eigenschaften als auch für Parameter.
     </p>
    </p></blockquote>
    <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
     <p class="para">
      <a href="language.attributes.php" class="link">Attribute</a>, die auf ein
      befördertes Konstruktorargument gelegt werden, werden sowohl auf die
      Eigenschaft als auch auf das Argument übertragen. Die Standardwerte für
      ein befördertes Konstruktorargument werden nur auf das Argument und
      nicht auf die Eigenschaft übertragen.
     </p>
    </p></blockquote>
   </div>

   <div class="sect3" id="language.oop5.decon.constructor.new">
    <h4 class="title">New bei der Initialisierung</h4>
    <p class="para">
     Ab PHP 8.1.0 können Objekte als Standardwerte für Parameter, als
     statische Variablen und globale Konstanten sowie in
     Eigenschaftsparametern verwendet werden. Objekte können nun auch an
     <span class="function"><a href="function.define.php" class="function">define()</a></span> übergeben werden.
    </p>
    <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
     <p class="para">
      Es ist nicht zulässig, einen dynamischen Klassennamen, einen
      Klassennamen, der keine Zeichenkette ist, oder eine anonyme Klasse zu
      verwenden. Es ist auch nicht zulässig, Parameter zu entpacken, und nicht
      unterstützte Ausdrücke als Parameter zu verwenden.
     </p>
    </p></blockquote>
    <div class="example" id="example-4">
     <p><strong>Beispiel #4 Verwendung von new bei Initialisierungen</strong></p>
     <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// Alles zulässig:<br /></span><span style="color: #007700">static </span><span style="color: #0000BB">$x </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">;<br /><br />const </span><span style="color: #0000BB">C </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">;<br /><br />function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">$param </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">) {}<br /><br />#[</span><span style="color: #0000BB">AnAttribute</span><span style="color: #007700">(new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">)]<br />class </span><span style="color: #0000BB">Test </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(<br />        public </span><span style="color: #0000BB">$prop </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">,<br />    ) {}<br />}<br /><br /></span><span style="color: #FF8000">// Alles nicht zulässig (Kompilierfehler):<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(<br />    </span><span style="color: #0000BB">$a </span><span style="color: #007700">= new (</span><span style="color: #0000BB">CLASS_NAME_CONSTANT</span><span style="color: #007700">)(), </span><span style="color: #FF8000">// dynamischer Klassenname<br />    </span><span style="color: #0000BB">$b </span><span style="color: #007700">= new class {}, </span><span style="color: #FF8000">// anonyme Klasse<br />    </span><span style="color: #0000BB">$c </span><span style="color: #007700">= new </span><span style="color: #0000BB">A</span><span style="color: #007700">(...[]), </span><span style="color: #FF8000">// Entpacken von Parametern<br />    </span><span style="color: #0000BB">$d </span><span style="color: #007700">= new </span><span style="color: #0000BB">B</span><span style="color: #007700">(</span><span style="color: #0000BB">$abc</span><span style="color: #007700">), </span><span style="color: #FF8000">// nicht unterstützter Ausdruck<br /></span><span style="color: #007700">) {}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </div>

   <div class="sect3" id="language.oop5.decon.constructor.static">
    <h4 class="title">Erzeugung über statische Methoden</h4>
    <p class="para">
     PHP unterstützt nur einen einzigen Konstruktor pro Klasse. In einigen
     Fällen, kann es jedoch wünschenswert sein, dass ein Objekt auf
     verschiedene Weisen mit unterschiedlichen Eingaben erzeugt werden kann.
     Der empfohlene Weg, dies zu tun, ist die, Konstruktoren in statische
     Methoden zu packen.
    </p>
    <div class="example" id="example-5">
     <p><strong>Beispiel #5 Die Erzeugung über statische Methoden verwenden</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$some_json_string </span><span style="color: #007700">= </span><span style="color: #DD0000">'{ "id": 1004, "name": "Elephpant" }'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$some_xml_string </span><span style="color: #007700">= </span><span style="color: #DD0000">"&lt;animal&gt;&lt;id&gt;1005&lt;/id&gt;&lt;name&gt;Elephpant&lt;/name&gt;&lt;/animal&gt;"</span><span style="color: #007700">;<br /><br />class </span><span style="color: #0000BB">Produkt </span><span style="color: #007700">{<br /><br />    private ?</span><span style="color: #0000BB">int $id</span><span style="color: #007700">;<br />    private ?</span><span style="color: #0000BB">string $name</span><span style="color: #007700">;<br /><br />    private function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(?</span><span style="color: #0000BB">int $id </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">, ?</span><span style="color: #0000BB">string $name </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id </span><span style="color: #007700">= </span><span style="color: #0000BB">$id</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name </span><span style="color: #007700">= </span><span style="color: #0000BB">$name</span><span style="color: #007700">;<br />    }<br /><br />    public static function </span><span style="color: #0000BB">fromBasicData</span><span style="color: #007700">(</span><span style="color: #0000BB">int $id</span><span style="color: #007700">, </span><span style="color: #0000BB">string $name</span><span style="color: #007700">): static {<br />        </span><span style="color: #0000BB">$neu </span><span style="color: #007700">= new static(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #0000BB">$name</span><span style="color: #007700">);<br />        return </span><span style="color: #0000BB">$neu</span><span style="color: #007700">;<br />    }<br /><br />    public static function </span><span style="color: #0000BB">fromJson</span><span style="color: #007700">(</span><span style="color: #0000BB">string $json</span><span style="color: #007700">): static {<br />        </span><span style="color: #0000BB">$daten </span><span style="color: #007700">= </span><span style="color: #0000BB">json_decode</span><span style="color: #007700">(</span><span style="color: #0000BB">$json</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />        return new static(</span><span style="color: #0000BB">$daten</span><span style="color: #007700">[</span><span style="color: #DD0000">'id'</span><span style="color: #007700">], </span><span style="color: #0000BB">$daten</span><span style="color: #007700">[</span><span style="color: #DD0000">'name'</span><span style="color: #007700">]);<br />    }<br /><br />    public static function </span><span style="color: #0000BB">fromXml</span><span style="color: #007700">(</span><span style="color: #0000BB">string $xml</span><span style="color: #007700">): static {<br />        </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">simplexml_load_string</span><span style="color: #007700">(</span><span style="color: #0000BB">$xml</span><span style="color: #007700">);<br />        </span><span style="color: #0000BB">$neu </span><span style="color: #007700">= new static();<br />        </span><span style="color: #0000BB">$neu</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id </span><span style="color: #007700">= (int) </span><span style="color: #0000BB">$daten</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$neu</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name </span><span style="color: #007700">= </span><span style="color: #0000BB">$daten</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br />        return </span><span style="color: #0000BB">$neu</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$p1 </span><span style="color: #007700">= </span><span style="color: #0000BB">Produkt</span><span style="color: #007700">::</span><span style="color: #0000BB">fromBasicData</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">, </span><span style="color: #DD0000">'Widget'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$p2 </span><span style="color: #007700">= </span><span style="color: #0000BB">Produkt</span><span style="color: #007700">::</span><span style="color: #0000BB">fromJson</span><span style="color: #007700">(</span><span style="color: #0000BB">$some_json_string</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$p3 </span><span style="color: #007700">= </span><span style="color: #0000BB">Produkt</span><span style="color: #007700">::</span><span style="color: #0000BB">fromXml</span><span style="color: #007700">(</span><span style="color: #0000BB">$some_xml_string</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$p1</span><span style="color: #007700">, </span><span style="color: #0000BB">$p2</span><span style="color: #007700">, </span><span style="color: #0000BB">$p3</span><span style="color: #007700">);</span></span></code></div>
     </div>

    </div>
    <p class="para">
     Der Konstruktor kann private oder protected gemacht werden, um zu
     verhindern, dass er von außen aufgerufen wird. Wenn dies der Fall ist,
     kann nur eine statische Methode die Klasse instanziieren. Da sie in der
     gleichen Klassendefinition enthalten ist, hat sie Zugriff auf private
     Methoden, auch wenn sie nicht zur gleichen Objektinstanz gehören. Der
     private Konstruktor ist optional und kann je nach Anwendungsfall sinnvoll
     sein oder nicht.
    </p>
    <p class="para">
     Die drei public static Methoden veranschaulichen dann verschiedene
     Möglichkeiten das Objekt zu instanziieren.
    </p>
    <ul class="simplelist">
     <li><code class="code">fromBasicData()</code> nimmt genau die Parameter, die
     benötigt werden, erzeugt dann das Objekt durch Aufruf des Konstruktors
     und Rückgabe des Ergebnisses.</li>
     <li><code class="code">fromJson()</code> akzeptiert eine JSON-Zeichenkette und
     führt selbst eine Vorverarbeitung durch, um sie in das vom Konstruktor
     gewünschte Format zu konvertieren. Sie gibt dann das neue Objekt
     zurück.</li>
     <li><code class="code">fromXml()</code> akzeptiert eine XML-Zeichenkette,
     vorverarbeitet sie und erzeugt dann ein leeres Objekt. Der Konstruktor
     wird immer noch aufgerufen, aber da alle Parameter optional sind,
     überspringt sie die Methode. Sie weist dann den Objekteigenschaften
     direkt Werte zu, bevor sie das Ergebnis zurückgibt.</li>
    </ul>
    <p class="para">
     In allen drei Fällen wird das Schlüsselwort <code class="code">static</code> in den
     Namen der Klasse übersetzt, in der sich der Code befindet. In diesem
     Fall: <code class="code">Produkt</code>.
    </p>
   </div>
  </div>
  <div class="sect2" id="language.oop5.decon.destructor">
   <h3 class="title">Destruktor</h3>
   <div class="methodsynopsis dc-description" id="object.destruct">
    <span class="methodname"><strong>__destruct</strong></span>(): <span class="type"><a href="language.types.void.php" class="type void">void</a></span></div>

   <p class="para">
    PHP verfügt über ein Destruktorkonzept ähnlich dem anderer
    objektorientierter Programmiersprachen wie C++. Die Destruktormethode wird
    aufgerufen, sobald es keine weiteren Referenzen auf ein bestimmtes Objekt
    mehr gibt, oder in beliebiger Reihenfolge am Ende des Skripts.
   </p>
   <div class="example" id="example-6">
    <p><strong>Beispiel #6 Destruktor-Beispiel</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyDestructableClass<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {<br />        print </span><span style="color: #DD0000">"Im Konstruktor\n"</span><span style="color: #007700">;<br />    }<br /><br />    function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">() {<br />        print </span><span style="color: #DD0000">"Zerstoere " </span><span style="color: #007700">. </span><span style="color: #0000BB">__CLASS__ </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</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">MyDestructableClass</span><span style="color: #007700">();</span></span></code></div>
    </div>

   </div>
   <p class="para">
    Wie Konstruktoren auch, werden Elterndestruktoren nicht implizit durch die
    Engine aufgerufen. Um einen Elterndestruktor zu benutzen muss man explizit
    die Funktion <span class="function"><strong>parent::__destruct()</strong></span> in der
    Destruktorimplementierung aufrufen. Ebenso wie Konstruktoren kann eine
    Kindklasse den Destruktor der Eltern erben, falls sie keinen eigenen
    implementiert.
   </p>
   <p class="para">
    Der Destruktor wird aufgerufen, wenn das Skript mittels
    <span class="function"><a href="function.exit.php" class="function">exit()</a></span> abgebrochen wird. Wenn <span class="function"><a href="function.exit.php" class="function">exit()</a></span>
    innerhalb eines Destruktors aufgerufen wird, verhindert das die Ausführung
    von jeglichen weiteren Shutdown-Routinen.
   </p>
   <p class="para">
    Wenn ein Destruktor neue Referenzen auf sein Objekt erzeugt, wird er nicht
    ein zweites Mal aufgerufen, wenn die Anzahl der Referenzen wieder Null
    erreicht oder während der Abschaltsequenz.
   </p>
   <p class="para">
    Seit PHP 8.4.0 werden, wenn die
    <a href="features.gc.collecting-cycles.php" class="link">Sammlung zyklischer Referenzen</a>
    während der Ausführung einer <a href="language.fibers.php" class="link">Fiber</a>
    stattfindet, die Destruktoren von Objekten, die für die Sammlung vorgesehen
    sind, in einer separaten Fiber namens <code class="literal">gc_destructor_fiber</code>
    ausgeführt.
    Wenn diese Fiber unterbrochen wird, wird eine neue erstellt, um alle
    verbleibenden Destruktoren auszuführen.
    Die vorherige <code class="literal">gc_destructor_fiber</code> wird vom Garbage
    Collector nicht mehr referenziert und kann, wenn sie nicht anderweitig
    referenziert wird, eingesammelt werden.
    Objekte, deren Destruktor ausgesetzt ist, werden nicht eingesammelt, bis
    der Destruktor zurückgibt oder die Fiber selbst eingesammelt wird.
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Der Destruktor wird während der Skript-Abschaltung aufgerufen, weshalb die
     Header immer bereits gesendet sind. Das aktuelle Verzeichnis während der
     Beendigungsphase des Skripts kann bei einigen SAPIs (z. B. Apache)
     ein anderes sein.
   </p>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Der Versuch, eine Exception aus einem Destruktor (der am Ende des Skripts
     aufgerufen wird) heraus zu auszulösen, führt zu einem fatalen Fehler.
    </p>
   </p></blockquote>
  </div>

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