<?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.magic.php',
    1 => 'Magische Methoden',
    2 => 'Magische Methoden',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Klassen und Objekte',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.iterations.php',
    1 => 'Objektiteration',
  ),
  'next' => 
  array (
    0 => 'language.oop5.final.php',
    1 => 'Final-Schl&uuml;sselwort',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'language/oop5/magic.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.magic" class="sect1">
  <h2 class="title">Magische Methoden</h2>
  <p class="para">
   Magische Methoden sind Methoden, die PHPs Standardverhalten überschreiben,
   wenn bestimmte Aktionen mit einem Objekt durchgeführt werden.
  </p>
  <div class="caution"><strong class="caution">Achtung</strong>
   <p class="simpara">
    Alle Methodennamen, die mit <code class="literal">__</code> beginnen, sind durch
    PHP reserviert. Es wird daher nicht empfohlen solche Methodennamen zu
    verwenden, außer wenn das Verhalten von PHP überschrieben werden soll.
   </p>
  </div>
  <p class="para">
   Die folgenden Methodennamen werden als magisch betrachtet:
   
   <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a>,
   <a href="language.oop5.decon.php#object.destruct" class="link">__destruct()</a>,
   <a href="language.oop5.overloading.php#object.call" class="link">__call()</a>,
   <a href="language.oop5.overloading.php#object.callstatic" class="link">__callStatic()</a>,
   <a href="language.oop5.overloading.php#object.get" class="link">__get()</a>,
   <a href="language.oop5.overloading.php#object.set" class="link">__set()</a>,
   <a href="language.oop5.overloading.php#object.isset" class="link">__isset()</a>,
   <a href="language.oop5.overloading.php#object.unset" class="link">__unset()</a>,
   <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a>,
   <a href="language.oop5.magic.php#object.wakeup" class="link">__wakeup()</a>,
   <a href="language.oop5.magic.php#object.serialize" class="link">__serialize()</a>,
   <a href="language.oop5.magic.php#object.unserialize" class="link">__unserialize()</a>,
   <a href="language.oop5.magic.php#object.tostring" class="link">__toString()</a>,
   <a href="language.oop5.magic.php#object.invoke" class="link">__invoke()</a>,
   <a href="language.oop5.magic.php#object.set-state" class="link">__set_state()</a>,
   <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a> und
   <a href="language.oop5.magic.php#object.debuginfo" class="link">__debugInfo()</a>.
  </p>
  <div class="warning"><strong class="warning">Warnung</strong>
   
   <p class="simpara">
    Mit Ausnahme von
    <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a>,
    <a href="language.oop5.decon.php#object.destruct" class="link">__destruct()</a> und
    <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a> <em>müssen</em>
    alle magischen Methoden als <code class="literal">public</code> deklariert werden,
    andernfalls wird eine <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> ausgegeben.
    Vor PHP 8.0.0 wurde für die magischen Methoden
    <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a>,
    <a href="language.oop5.magic.php#object.wakeup" class="link">__wakeup()</a>,
    <a href="language.oop5.magic.php#object.serialize" class="link">__serialize()</a>,
    <a href="language.oop5.magic.php#object.unserialize" class="link">__unserialize()</a> und
    <a href="language.oop5.magic.php#object.set-state" class="link">__set_state()</a> keine Diagnose
    ausgegeben.
   </p>
  </div>
  <div class="warning"><strong class="warning">Warnung</strong>
   <p class="para">
    Falls Typdeklarationen in der Definition der magischen Methoden angegeben
    werden, müssen diese identisch zu den Signaturen sein, die in diesem
    Dokument beschrieben werden, andernfalls wird ein fataler Fehler
    hervorgerufen. Vor PHP 8.0.0 wurde keine Diagnose ausgegeben. Allerdings
    dürfen <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> und
    <a href="language.oop5.decon.php#object.destruct" class="link">__destruct()</a> keinen Rückgabetyp
    deklarieren, sonst wird ein fataler Fehler ausgegeben.
   </p>
  </div>

  <div class="sect2" id="language.oop5.magic.sleep">
   <h3 class="title">
    <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a> und
    <a href="language.oop5.magic.php#object.wakeup" class="link">__wakeup()</a>
   </h3>

   <div class="methodsynopsis dc-description" id="object.sleep">
    <span class="modifier">public</span> <span class="methodname"><strong>__sleep</strong></span>(): <span class="type"><a href="language.types.array.php" class="type array">array</a></span></div>

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


   <p class="para">
    <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span> prüft, ob die Klasse eine Funktion mit dem
    magischen Namen <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a> besitzt.
    Wenn dem so ist, wird die Funktion vor jeder Serialisierung ausgeführt.
    Sie kann das Objekt aufräumen und es wird von ihr erwartet, dass sie ein
    Array mit den Namen aller Variablen zurückgibt, die serialisiert werden
    sollen. Wenn die Methode nichts zurückgibt, wird <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> serialisiert und
    eine <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong> ausgegeben.
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a> kann keine Namen von
     privaten Eigenschaften in Elternklassen zurückgeben. Dies würde zu einem
     Fehler der Stufe <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong> führen. Stattdessen sollte
     das <span class="classname"><a href="class.serializable.php" class="classname">Serializable</a></span>-Interface verwendet werden.
    </p>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Seit PHP 8.0.0 erzeugt die Rückgabe eines Wertes von
     <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a>, der kein Array ist, eine
     Warnung; vorher führte dies zu einem Hinweis.
    </p>
   </p></blockquote>
   <p class="para">
    Der Zweck von von <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a> ist, nicht
    gespeicherte Daten zu sichern oder ähnliche Aufräumarbeiten zu erledigen.
    Die Funktion ist ebenfalls nützlich, wenn ein sehr großes Objekt nicht
    komplett gespeichert werden muss.
   </p>
   <p class="para">
    Umgekehrt überprüft <span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span>, ob eine Funktion mit
    dem magischen Namen <a href="language.oop5.magic.php#object.wakeup" class="link">__wakeup()</a>
    vorhanden ist. Falls vorhanden, kann diese Funktion alle Ressourcen, die
    das Objekt möglicherweise hat, wiederherstellen.
   </p>
   <p class="para">
    Der Zweck von <a href="language.oop5.magic.php#object.wakeup" class="link">__wakeup()</a> ist es, alle
    Datenbankverbindungen, die bei der Serialisierung verlorengegangen sind,
    wiederherzustellen und andere Aufgaben der erneuten Initialisierung
    durchzuführen.
   </p>
  <div class="example" id="example-1">
   <p><strong>Beispiel #1 Sleep- und Wakeup-Beispiel</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">Connection<br /></span><span style="color: #007700">{<br />    protected </span><span style="color: #0000BB">$link</span><span style="color: #007700">;<br />    private </span><span style="color: #0000BB">$dsn</span><span style="color: #007700">, </span><span style="color: #0000BB">$username</span><span style="color: #007700">, </span><span style="color: #0000BB">$password</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">$dsn</span><span style="color: #007700">, </span><span style="color: #0000BB">$username</span><span style="color: #007700">, </span><span style="color: #0000BB">$password</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dsn </span><span style="color: #007700">= </span><span style="color: #0000BB">$dsn</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">username </span><span style="color: #007700">= </span><span style="color: #0000BB">$username</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">password </span><span style="color: #007700">= </span><span style="color: #0000BB">$password</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connect</span><span style="color: #007700">();<br />    }<br /><br />    private function </span><span style="color: #0000BB">connect</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">link </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dsn</span><span style="color: #007700">, </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">username</span><span style="color: #007700">, </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">password</span><span style="color: #007700">);<br />    }<br /><br />    public function </span><span style="color: #0000BB">__sleep</span><span style="color: #007700">()<br />    {<br />        return array(</span><span style="color: #DD0000">'dsn'</span><span style="color: #007700">, </span><span style="color: #DD0000">'username'</span><span style="color: #007700">, </span><span style="color: #DD0000">'password'</span><span style="color: #007700">);<br />    }<br /><br />    public function </span><span style="color: #0000BB">__wakeup</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connect</span><span style="color: #007700">();<br />    }<br />}</span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>

  <div class="sect2" id="language.oop5.magic.serialize">
   <h3 class="title">
    <a href="language.oop5.magic.php#object.serialize" class="link">__serialize()</a> und
    <a href="language.oop5.magic.php#object.unserialize" class="link">__unserialize()</a>
   </h3>

   <div class="methodsynopsis dc-description" id="object.serialize">
    <span class="modifier">public</span> <span class="methodname"><strong>__serialize</strong></span>(): <span class="type"><a href="language.types.array.php" class="type array">array</a></span></div>

   <div class="methodsynopsis dc-description" id="object.unserialize"><span class="modifier">public</span> <span class="methodname"><strong>__unserialize</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.array.php" class="type array">array</a></span> <code class="parameter">$data</code></span>): <span class="type"><a href="language.types.void.php" class="type void">void</a></span></div>


   <p class="para">
    <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span> prüft, ob die Klasse eine Funktion mit dem
    magischen Namen <a href="language.oop5.magic.php#object.serialize" class="link">__serialize()</a>
    besitzt. Wenn dem so ist, wird die Funktion vor jeder Serialisierung
    ausgeführt. Sie muss ein assoziatives Array von Schlüssel/Wert-Paaren
    erzeugen und zurückgeben, die die serialisierte Form des Objekts
    darstellen. Wird kein Array zurückgegeben, wird ein
    <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> geworfen.
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Sind sowohl <a href="language.oop5.magic.php#object.serialize" class="link">__serialize()</a> als
     auch <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a> im selben Objekt
     definiert, wird nur <a href="language.oop5.magic.php#object.serialize" class="link">__serialize()</a>
     aufgerufen. <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a> wird ignoriert.
     Implementiert das Objekt das
     <a href="class.serializable.php" class="link">Serializable</a>-Interface, wird
     die <code class="literal">serialize()</code>-Methode des Interfaces ignoriert und
     stattdessen <a href="language.oop5.magic.php#object.serialize" class="link">__serialize()</a> verwendet.
    </p>
   </p></blockquote>
   <p class="para">
    Der Zweck von <a href="language.oop5.magic.php#object.serialize" class="link">__serialize()</a> ist,
    eine für die Serialisierung geeignete beliebige Darstellung eines Objekts
    zu definieren. Die Elemente des Arrays können den Eigenschaften des
    Objekts entsprechen, aber das ist nicht erforderlich.
   </p>
   <p class="para">
    Umgekehrt überprüft <span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span>, ob eine Funktion mit
    dem magischen Namen
    <a href="language.oop5.magic.php#object.unserialize" class="link">__unserialize()</a> vorhanden ist.
    Falls vorhanden, wird dieser Funktion das wiederhergestellte Array
    übergeben, das von <a href="language.oop5.magic.php#object.serialize" class="link">__serialize()</a>
    zurückgegeben wurde. Sie kann dann gegebenenfalls die Eigenschaften des
    Objekts aus diesem Array wiederherstellen.
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Sind sowohl <a href="language.oop5.magic.php#object.unserialize" class="link">__unserialize()</a> als
     auch <a href="language.oop5.magic.php#object.wakeup" class="link">__wakeup()</a> im selben Objekt
     definiert, wird nur
     <a href="language.oop5.magic.php#object.unserialize" class="link">__unserialize()</a> aufgerufen.
     <a href="language.oop5.magic.php#object.wakeup" class="link">__wakeup()</a> wird ignoriert.
    </p>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Dieses Feature ist seit PHP 7.4.0 verfügbar.
    </p>
   </p></blockquote>
   <div class="example" id="example-2">
    <p><strong>Beispiel #2 Serialize und unserialize</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">Connection<br /></span><span style="color: #007700">{<br />    protected </span><span style="color: #0000BB">$link</span><span style="color: #007700">;<br />    private </span><span style="color: #0000BB">$dsn</span><span style="color: #007700">, </span><span style="color: #0000BB">$username</span><span style="color: #007700">, </span><span style="color: #0000BB">$password</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">$dsn</span><span style="color: #007700">, </span><span style="color: #0000BB">$username</span><span style="color: #007700">, </span><span style="color: #0000BB">$password</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dsn </span><span style="color: #007700">= </span><span style="color: #0000BB">$dsn</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">username </span><span style="color: #007700">= </span><span style="color: #0000BB">$username</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">password </span><span style="color: #007700">= </span><span style="color: #0000BB">$password</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connect</span><span style="color: #007700">();<br />    }<br /><br />    private function </span><span style="color: #0000BB">connect</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">link </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dsn</span><span style="color: #007700">, </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">username</span><span style="color: #007700">, </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">password</span><span style="color: #007700">);<br />    }<br /><br />    public function </span><span style="color: #0000BB">__serialize</span><span style="color: #007700">(): array<br />    {<br />        return [<br />          </span><span style="color: #DD0000">'dsn' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dsn</span><span style="color: #007700">,<br />          </span><span style="color: #DD0000">'user' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">username</span><span style="color: #007700">,<br />          </span><span style="color: #DD0000">'pass' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">password</span><span style="color: #007700">,<br />        ];<br />    }<br /><br />    public function </span><span style="color: #0000BB">__unserialize</span><span style="color: #007700">(array </span><span style="color: #0000BB">$data</span><span style="color: #007700">): </span><span style="color: #0000BB">void<br />    </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dsn </span><span style="color: #007700">= </span><span style="color: #0000BB">$data</span><span style="color: #007700">[</span><span style="color: #DD0000">'dsn'</span><span style="color: #007700">];<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">username </span><span style="color: #007700">= </span><span style="color: #0000BB">$data</span><span style="color: #007700">[</span><span style="color: #DD0000">'user'</span><span style="color: #007700">];<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">password </span><span style="color: #007700">= </span><span style="color: #0000BB">$data</span><span style="color: #007700">[</span><span style="color: #DD0000">'pass'</span><span style="color: #007700">];<br /><br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connect</span><span style="color: #007700">();<br />    }<br />}</span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>

  <div class="sect2" id="language.oop5.magic.tostring">
   <h3 class="title"><a href="language.oop5.magic.php#object.tostring" class="link">__toString()</a></h3>
   <div class="methodsynopsis dc-description" id="object.tostring">
    <span class="modifier">public</span> <span class="methodname"><strong>__toString</strong></span>(): <span class="type"><a href="language.types.string.php" class="type string">string</a></span></div>

   <p class="para">
    Mit der Methode <a href="language.oop5.magic.php#object.tostring" class="link">__toString()</a> kann
    eine Klasse entscheiden, wie sie reagieren soll, wenn sie wie eine
    Zeichenkette behandelt wird. Die beeinflusst beispielsweise, was
    <code class="literal">echo $obj;</code> ausgeben wird.
   </p>
   <div class="warning"><strong class="warning">Warnung</strong>
    <p class="para">
     Seit PHP 8.0.0 unterliegt der Rückgabewert dieser Methode der üblichen
     PHP-Semantik für Typen. Das heißt, er bei deaktivierter
     <a href="language.types.declarations.php#language.types.declarations.strict" class="link">strikter Typisierung</a>
     nach Möglichkeit in einen <span class="type"><a href="language.types.string.php" class="type String">String</a></span> umgewandelt.
    </p>
    <p class="para">
     Wenn die
     <a href="language.types.declarations.php#language.types.declarations.strict" class="link">Strikte Typisierung</a>
     aktiviert ist, wird ein <span class="interfacename"><a href="class.stringable.php" class="interfacename">Stringable</a></span>-Objekt
     von einer <span class="type"><a href="language.types.string.php" class="type string">string</a></span>-Typdeklaration <em>nicht</em>
     akzeptiert. Wenn ein solches Verhalten erwünscht ist, muss die
     Typdeklaration <span class="interfacename"><a href="class.stringable.php" class="interfacename">Stringable</a></span> und
     <span class="type"><a href="language.types.string.php" class="type string">string</a></span> mittels Union-Typ akzeptieren.
    </p>
    <p class="para">
     Seit PHP 8.0.0 implementiert jede Klasse, die eine
     <a href="language.oop5.magic.php#object.tostring" class="link">__toString()</a>-Methode enthält,
     implizit auch das Interface <span class="interfacename"><a href="class.stringable.php" class="interfacename">Stringable</a></span> und
     erfüllt daher auch Typprüfungen auf dieses Interface. Es wird dennoch
     empfohlen, dieses Interface explizit zu implementieren.
    </p>
    <p class="para">
     In PHP 7.4 <em>muss</em> der Rückgabewert ein Wert vom Typ
     <span class="type"><a href="language.types.string.php" class="type string">string</a></span> sein, andernfalls wird ein
     <span class="classname"><a href="class.error.php" class="classname">Error</a></span> geworfen.
    </p>
    <p class="para">
     Vor PHP 7.4.0 <em>muss</em> der Rückgabewert ein Wert vom Typ
     <span class="type"><a href="language.types.string.php" class="type string">string</a></span> sein, ansonsten wird ein Fehler der Stufe
     <strong><code><a href="errorfunc.constants.php#constant.e-recoverable-error">E_RECOVERABLE_ERROR</a></code></strong> hervorgerufen.
    </p>
   </div>
   <div class="warning"><strong class="warning">Warnung</strong>
    <p class="simpara">
     Es war vor PHP 7.4.0 nicht möglich eine Exception aus einer
     <a href="language.oop5.magic.php#object.tostring" class="link">__toString()</a>-Methode zu werfen.
     Dies resultierte in einem fatalen Fehler.
    </p>
   </div>
   <div class="example" id="example-3">
    <p><strong>Beispiel #3 Einfaches Beispiel</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: #FF8000">// Deklariere eine einfache Klasse<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">TestClass<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$foo</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">$foo</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo </span><span style="color: #007700">= </span><span style="color: #0000BB">$foo</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">__toString</span><span style="color: #007700">()<br />    {<br />        return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$class </span><span style="color: #007700">= new </span><span style="color: #0000BB">TestClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'Hallo'</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">$class</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 folgende Ausgabe:</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Hallo
</pre></div>
    </div>
   </div>
  </div>

  <div class="sect2" id="language.oop5.magic.invoke">
   <h3 class="title"><a href="language.oop5.magic.php#object.invoke" class="link">__invoke()</a></h3>
   <div class="methodsynopsis dc-description" id="object.invoke">
    <span class="methodname"><strong>__invoke</strong></span>(<span class="methodparam"> <code class="parameter">...$values</code></span>): <span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span></div>

   <p class="para">
    Die Methode <a href="language.oop5.magic.php#object.invoke" class="link">__invoke()</a> wird
    aufgerufen, wenn ein Skript versucht, ein Objekt als Funktion aufzurufen.
   </p>
   <div class="example" id="example-4">
    <p><strong>Beispiel #4 Nutzung von <a href="language.oop5.magic.php#object.invoke" class="link">__invoke()</a></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">CallableClass<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__invoke</span><span style="color: #007700">(</span><span style="color: #0000BB">$x</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$x</span><span style="color: #007700">);<br />    }<br />}<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">CallableClass</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$obj</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">is_callable</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj</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 folgende Ausgabe:</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
int(5)
bool(true)
</pre></div>
    </div>
   </div>
   <div class="example" id="example-5">
    <p><strong>Beispiel #5 Nutzung von <a href="language.oop5.magic.php#object.invoke" class="link">__invoke()</a></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">Sort<br /></span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$key</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">string $key</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">key </span><span style="color: #007700">= </span><span style="color: #0000BB">$key</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">__invoke</span><span style="color: #007700">(array </span><span style="color: #0000BB">$a</span><span style="color: #007700">, array </span><span style="color: #0000BB">$b</span><span style="color: #007700">): </span><span style="color: #0000BB">int<br />    </span><span style="color: #007700">{<br />        return </span><span style="color: #0000BB">$a</span><span style="color: #007700">[</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">key</span><span style="color: #007700">] &lt;=&gt; </span><span style="color: #0000BB">$b</span><span style="color: #007700">[</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">key</span><span style="color: #007700">];<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$customers </span><span style="color: #007700">= [<br />    [</span><span style="color: #DD0000">'id' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #DD0000">'first_name' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'John'</span><span style="color: #007700">, </span><span style="color: #DD0000">'last_name' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'Do'</span><span style="color: #007700">],<br />    [</span><span style="color: #DD0000">'id' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #DD0000">'first_name' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'Alice'</span><span style="color: #007700">, </span><span style="color: #DD0000">'last_name' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'Gustav'</span><span style="color: #007700">],<br />    [</span><span style="color: #DD0000">'id' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #DD0000">'first_name' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'Bob'</span><span style="color: #007700">, </span><span style="color: #DD0000">'last_name' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'Filipe'</span><span style="color: #007700">]<br />];<br /><br /></span><span style="color: #FF8000">// Kunden nach Vornamen sortieren<br /></span><span style="color: #0000BB">usort</span><span style="color: #007700">(</span><span style="color: #0000BB">$customers</span><span style="color: #007700">, new </span><span style="color: #0000BB">Sort</span><span style="color: #007700">(</span><span style="color: #DD0000">'first_name'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$customers</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Kunden nach Nachnamen sortieren<br /></span><span style="color: #0000BB">usort</span><span style="color: #007700">(</span><span style="color: #0000BB">$customers</span><span style="color: #007700">, new </span><span style="color: #0000BB">Sort</span><span style="color: #007700">(</span><span style="color: #DD0000">'last_name'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$customers</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 folgende Ausgabe:</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Array
(
    [0] =&gt; Array
        (
            [id] =&gt; 3
            [first_name] =&gt; Alice
            [last_name] =&gt; Gustav
        )

    [1] =&gt; Array
        (
            [id] =&gt; 2
            [first_name] =&gt; Bob
            [last_name] =&gt; Filipe
        )

    [2] =&gt; Array
        (
            [id] =&gt; 1
            [first_name] =&gt; John
            [last_name] =&gt; Do
        )

)
Array
(
    [0] =&gt; Array
        (
            [id] =&gt; 1
            [first_name] =&gt; John
            [last_name] =&gt; Do
        )

    [1] =&gt; Array
        (
            [id] =&gt; 2
            [first_name] =&gt; Bob
            [last_name] =&gt; Filipe
        )

    [2] =&gt; Array
        (
            [id] =&gt; 3
            [first_name] =&gt; Alice
            [last_name] =&gt; Gustav
        )

)
</pre></div>
    </div>
   </div>
  </div>

  <div class="sect2" id="language.oop5.magic.set-state">
   <h3 class="title"><a href="language.oop5.magic.php#object.set-state" class="link">__set_state()</a></h3>
   <div class="methodsynopsis dc-description" id="object.set-state">
    <span class="modifier">static</span> <span class="methodname"><strong>__set_state</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.array.php" class="type array">array</a></span> <code class="parameter">$properties</code></span>): <span class="type"><a href="language.types.object.php" class="type object">object</a></span></div>

   <p class="para">
    Diese <a href="language.oop5.static.php" class="link">statische</a> Methode wird
    für Klassen aufgerufen, die mittels <span class="function"><a href="function.var-export.php" class="function">var_export()</a></span>
    exportiert werden.
   </p>
   <p class="para">
    Der einzige Parameter dieser Methode ist ein Array, welches aus
    exportierten Eigenschaften der Form <code class="literal">[&#039;Eigenschaft&#039; =&gt; Wert,
    ...]</code> besteht.
   </p>
   <div class="example" id="example-6">
    <p><strong>Beispiel #6 Verwendung von <a href="language.oop5.magic.php#object.set-state" class="link">__set_state()</a></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">A<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$var1</span><span style="color: #007700">;<br />    public </span><span style="color: #0000BB">$var2</span><span style="color: #007700">;<br /><br />    public static function </span><span style="color: #0000BB">__set_state</span><span style="color: #007700">(</span><span style="color: #0000BB">$an_array</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">A</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">var1 </span><span style="color: #007700">= </span><span style="color: #0000BB">$an_array</span><span style="color: #007700">[</span><span style="color: #DD0000">'var1'</span><span style="color: #007700">];<br />        </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">var2 </span><span style="color: #007700">= </span><span style="color: #0000BB">$an_array</span><span style="color: #007700">[</span><span style="color: #DD0000">'var2'</span><span style="color: #007700">];<br />        return </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">A</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">var1 </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">var2 </span><span style="color: #007700">= </span><span style="color: #DD0000">'foo'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">var_export</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$b</span><span style="color: #007700">);<br />eval(</span><span style="color: #DD0000">'$c = ' </span><span style="color: #007700">. </span><span style="color: #0000BB">$b </span><span style="color: #007700">. </span><span style="color: #DD0000">';'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$c</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 folgende Ausgabe:</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
string(60) &quot;A::__set_state(array(
   &#039;var1&#039; =&gt; 5,
   &#039;var2&#039; =&gt; &#039;foo&#039;,
))&quot;
object(A)#2 (2) {
  [&quot;var1&quot;]=&gt;
  int(5)
  [&quot;var2&quot;]=&gt;
  string(3) &quot;foo&quot;
}
</pre></div>
    </div>
   </div>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     Wenn ein Objekt exportiert wird, überprüft
     <span class="function"><a href="function.var-export.php" class="function">var_export()</a></span> nicht, ob
     <a href="language.oop5.magic.php#object.set-state" class="link">__set_state()</a> von der
     Objektklasse implementiert wird, sodass der erneute Import von Objekten
     zu einer <span class="classname"><a href="class.error.php" class="classname">Error</a></span>-Exception führt, falls
     __set_state() nicht implementiert ist. Die betrifft insbesondere einige
     interne Klassen.
    </span>
    <span class="simpara">
     Es liegt im Aufgabenbereich des Programmiers, sicherzustellen, dass nur
     Objekte wieder re-importiert werden, welche auch __set_state()
     implementieren.
    </span>
   </p></blockquote>
  </div>

  <div class="sect2" id="language.oop5.magic.debuginfo">
   <h3 class="title"><a href="language.oop5.magic.php#object.debuginfo" class="link">__debugInfo()</a></h3>
   <div class="methodsynopsis dc-description" id="object.debuginfo">
    <span class="methodname"><strong>__debugInfo</strong></span>(): <span class="type"><a href="language.types.array.php" class="type array">array</a></span></div>

   <p class="para">
    Diese Methode wird von <span class="function"><a href="function.var-dump.php" class="function">var_dump()</a></span> aufgerufen, wenn
    ein Objekt ausgegeben wird, um die Eigenschaften auszulesen die gezeigt
    werden sollen. Wenn diese Methode in einem Objekt nicht definiert ist,
    so werden alle Eigenschaften angezeigt, die public, protected oder private
    sind.
   </p>
   <div class="example" id="example-7">
    <p><strong>Beispiel #7 Verwendung von <a href="language.oop5.magic.php#object.debuginfo" class="link">__debugInfo()</a></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">C </span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$prop</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">$val</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop </span><span style="color: #007700">= </span><span style="color: #0000BB">$val</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">__debugInfo</span><span style="color: #007700">() {<br />        return [<br />            </span><span style="color: #DD0000">'propSquared' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop </span><span style="color: #007700">** </span><span style="color: #0000BB">2</span><span style="color: #007700">,<br />        ];<br />    }<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(new </span><span style="color: #0000BB">C</span><span style="color: #007700">(</span><span style="color: #0000BB">42</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 folgende Ausgabe:</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
object(C)#1 (1) {
  [&quot;propSquared&quot;]=&gt;
  int(1764)
}
</pre></div>
    </div>
   </div>
  </div>
 </div><?php manual_footer($setup); ?>