<?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.basic.php',
    1 => 'Die Grundlagen',
    2 => 'Die Grundlagen',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Klassen und Objekte',
  ),
  'prev' => 
  array (
    0 => 'oop5.intro.php',
    1 => 'Einf&uuml;hrung',
  ),
  'next' => 
  array (
    0 => 'language.oop5.properties.php',
    1 => 'Eigenschaften',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'language/oop5/basic.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.basic" class="sect1">
  <h2 class="title">Die Grundlagen</h2>

  <div class="sect2" id="language.oop5.basic.class">
   <h3 class="title">class</h3>
   <p class="para">
    Einfache Klassendefinitionen beginnen mit dem Schlüsselwort
    <code class="literal">class</code>, gefolgt von einem Klassennamen, gefolgt von
    einem Paar geschweifter Klammern, die die Definitionen der Eigenschaften
    und Methoden der Klasse enthalten.
   </p>
   <p class="para">
    Der Klassenname kann ein beliebiger gültiger Bezeichner sein,
    vorausgesetzt es ist kein von PHP
    <a href="reserved.php" class="link">reserviertes Wort</a>.
    Seit PHP 8.4.0 ist die Verwendung eines einzelnen Unterstrichs
    <code class="literal">_</code> als Klassenname veraltet.
    Ein gültiger Klassenname beginnt mit einem Buchstaben oder einem
    Unterstrich, gefolgt von einer beliebigen Anzahl von Buchstaben, Ziffern
    oder Unterstrichen; als regulärer Ausdruck formuliert:
    <code class="code">^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$</code>.
   </p>
   <p class="para">
    Eine Klasse darf aus ihren eigenen
    <a href="language.oop5.constants.php" class="link">Konstanten</a>,
    <a href="language.oop5.properties.php" class="link">Variablen</a>
    (&quot;Eigenschaften&quot; genannt) und Funktionen (&quot;Methoden&quot; genannt) bestehen.
   </p>
   <div class="example" id="example-1">
    <p><strong>Beispiel #1 Definition einer einfachen Klasse</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">SimpleClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Deklaration einer Eigenschaft<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">$var </span><span style="color: #007700">= </span><span style="color: #DD0000">'ein Standardwert'</span><span style="color: #007700">;<br /><br />    </span><span style="color: #FF8000">// Deklaration einer Methode<br />    </span><span style="color: #007700">public function </span><span style="color: #0000BB">displayVar</span><span style="color: #007700">() {<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">var</span><span style="color: #007700">;<br />    }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">
    Die Pseudovariable <var class="varname">$this</var> ist verfügbar, wenn eine
    Methode aus einem Objektkontext heraus aufgerufen wird.
    <var class="varname">$this</var> ist eine Referenz auf das aufgerufene Objekt.
   </p>
   <div class="warning"><strong class="warning">Warnung</strong>
    <p class="para">
     Wird eine nicht-statische Methode statisch aufgerufen, so wird ein
     <span class="classname"><a href="class.error.php" class="classname">Error</a></span> ausgelöst. Vor PHP 8.0.0 führte dies zu
     einem Hinweis über das veraltete Verfahren und <var class="varname">$this</var>
     war nicht definiert.
    </p>
    <div class="example" id="language.oop5.basic.class.this">
     <p><strong>Beispiel #2 Einige Beispiele für die Pseudovariable <var class="varname">$this</var></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">A<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />    {<br />        if (isset(</span><span style="color: #0000BB">$this</span><span style="color: #007700">)) {<br />            echo </span><span style="color: #DD0000">'$this ist definiert ('</span><span style="color: #007700">;<br />            echo </span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">);<br />            echo </span><span style="color: #DD0000">").\n"</span><span style="color: #007700">;<br />        } else {<br />            echo </span><span style="color: #DD0000">"\$this ist nicht definiert.\n"</span><span style="color: #007700">;<br />        }<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">bar</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</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">foo</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= new </span><span style="color: #0000BB">B</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">bar</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 mit PHP 7 folgende Ausgabe:</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
$this ist definiert (A).

Deprecated: Non-static method A::foo() should not be called statically in %s  on line 27
$this ist nicht definiert.

Deprecated: Non-static method A::foo() should not be called statically in %s  on line 20
$this ist nicht definiert.

Deprecated: Non-static method B::bar() should not be called statically in %s  on line 32

Deprecated: Non-static method A::foo() should not be called statically in %s  on line 20
$this ist nicht definiert.
</pre></div>
     </div>
     <div class="example-contents"><p>Das oben gezeigte Beispiel erzeugt mit PHP 8 folgende Ausgabe:</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
$this ist definiert (A).

Fatal error: Uncaught Error: Non-static method A::foo() cannot be called statically in %s :27
Stack trace:
#0 {main}
  thrown in %s  on line 27
</pre></div>
     </div>
    </div>
   </div>

   <div class="sect3" id="language.oop5.basic.class.readonly">
    <h4 class="title">Schreibgeschützte Klassen</h4>
    <p class="para">
     Seit PHP 8.2.0 kann eine Klasse mit dem Modifikator
     <span class="modifier">readonly</span> gekennzeichnet werden. Wenn eine Klasse als
     <span class="modifier">readonly</span> markiert wird, wird der
     <a href="language.oop5.properties.php#language.oop5.properties.readonly-properties" class="link">Modifikator <span class="modifier">readonly</span></a>
     zu jeder deklarierten Eigenschaft hinzugefügt und die Erstellung
     <a href="language.oop5.properties.php#language.oop5.properties.dynamic-properties" class="link">dynamischer Eigenschaften</a>
     verhindert. Darüber hinaus ist es nicht möglich, die Unterstützung für
     solche Eigenschaften mit Hilfe des Attributs
     <span class="classname"><a href="class.allowdynamicproperties.php" class="classname">AllowDynamicProperties</a></span> hinzuzufügen. Der Versuch,
     dies zu tun, führt zu einem Fehler bei der Kompilierung.
    </p>
    <div class="informalexample">
     <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">#[</span><span style="color: #0000BB">\AllowDynamicProperties</span><span style="color: #007700">]<br />readonly class </span><span style="color: #0000BB">Foo </span><span style="color: #007700">{<br />}<br /><br /></span><span style="color: #FF8000">// Fatal error: Cannot apply #[AllowDynamicProperties] to readonly class Foo<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

    <p class="para">
     Da weder nicht typisierte noch statische Eigenschaften mit dem
     <code class="literal">readonly</code>-Modifikator gekennzeichnet werden können,
     können readonly-Klassen diese auch nicht deklarieren:
    </p>
    <div class="informalexample">
     <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">readonly class </span><span style="color: #0000BB">Foo<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$bar</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Fatal error: Readonly property Foo::$bar must have type<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <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">readonly class </span><span style="color: #0000BB">Foo<br /></span><span style="color: #007700">{<br />    public static </span><span style="color: #0000BB">int $bar</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Fatal error: Readonly class Foo cannot declare static properties<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    <p class="para">
     Eine <span class="modifier">readonly</span>-Klasse kann nur dann
     <a href="language.oop5.basic.php#language.oop5.basic.extends" class="link">erweitert</a> werden, wenn
     die Kindklasse ebenfalls eine <span class="modifier">readonly</span>-Klasse ist.
    </p>
   </div>
  </div>

  <div class="sect2" id="language.oop5.basic.new">
   <h3 class="title">new</h3>
   <p class="para">
    Um eine Instanz einer Klasse zu erzeugen, muss das Schlüsselwort
    <code class="literal">new</code> verwendet werden. Ein Objekt wird immer erzeugt,
    außer das Objekt besitzt einen definierten
    <a href="language.oop5.decon.php" class="link">Konstruktor</a>, der aufgrund eines
    Fehlers eine <a href="language.exceptions.php" class="link">Exception</a> auslöst.
    Klassen sollten vor ihrer Instantiierung definiert werden (in manchen
    Fällen ist dies eine Notwendigkeit).
   </p>
   <p class="para">
    Wenn eine Variable, die einen <span class="type"><a href="language.types.string.php" class="type String">String</a></span> mit dem Namen einer
    Klasse enthält, zusammen mit <code class="literal">new</code> verwendet wird, wird
    eine neue Instanz dieser Klasse erzeugt. Falls sich die Klasse in einem
    Namensraum befindet, muss der voll qualifizierte Name hierfür genutzt
    werden.
   </p>

   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Wenn dem Klassenkonstruktor keine Argumente übergeben werden müssen,
     können die Klammern hinter dem Klassennamen weggelassen werden.
    </p>
   </p></blockquote>

   <div class="example" id="example-2">
    <p><strong>Beispiel #3 Eine Instanz erzeugen</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">SimpleClass </span><span style="color: #007700">{<br />}<br /><br /></span><span style="color: #0000BB">$instanz </span><span style="color: #007700">= new </span><span style="color: #0000BB">SimpleClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$instanz</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// dies ist auch mit einer Variablen möglich:<br /></span><span style="color: #0000BB">$klassenName </span><span style="color: #007700">= </span><span style="color: #DD0000">'SimpleClass'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$instanz </span><span style="color: #007700">= new </span><span style="color: #0000BB">$klassenName</span><span style="color: #007700">(); </span><span style="color: #FF8000">// new SimpleClass()<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">
    Seit PHP 8.0.0 wird die Verwendung von <code class="literal">new</code> mit
    beliebigen Ausdrücken unterstützt. Dies ermöglicht eine komplexere
    Instanziierung, sofern der Ausdruck einen <span class="type"><a href="language.types.string.php" class="link">String</a></span> erzeugt.
    Die Ausdrücke müssen in Klammern eingeschlossen werden.
   </p>
   <div class="example" id="example-3">
    <p><strong>Beispiel #4 Erzeugen einer Instanz mit einem beliebigen Ausdruck</strong></p>
    <div class="example-contents"><p>
     Hier werden mehrere Beispiele für gültige beliebige Ausdrücke gezeigt,
     die einen Klassennamen erzeugen. Enthalten ist ein Funktionsaufruf, eine
     String-Verkettung und die Konstante <strong><code>::class</code></strong>.
    </p></div>
    <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">ClassA </span><span style="color: #007700">extends </span><span style="color: #0000BB">\stdClass </span><span style="color: #007700">{}<br />class </span><span style="color: #0000BB">ClassB </span><span style="color: #007700">extends </span><span style="color: #0000BB">\stdClass </span><span style="color: #007700">{}<br />class </span><span style="color: #0000BB">ClassC </span><span style="color: #007700">extends </span><span style="color: #0000BB">ClassB </span><span style="color: #007700">{}<br />class </span><span style="color: #0000BB">ClassD </span><span style="color: #007700">extends </span><span style="color: #0000BB">ClassA </span><span style="color: #007700">{}<br /><br />function </span><span style="color: #0000BB">getSomeClass</span><span style="color: #007700">(): </span><span style="color: #0000BB">string<br /></span><span style="color: #007700">{<br />    return </span><span style="color: #DD0000">'ClassA'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(new (</span><span style="color: #0000BB">getSomeClass</span><span style="color: #007700">()));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(new (</span><span style="color: #DD0000">'Class' </span><span style="color: #007700">. </span><span style="color: #DD0000">'B'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(new (</span><span style="color: #DD0000">'Class' </span><span style="color: #007700">. </span><span style="color: #DD0000">'C'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(new (</span><span style="color: #0000BB">ClassD</span><span style="color: #007700">::class));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Das oben gezeigte Beispiel erzeugt mit PHP 8 folgende Ausgabe:</p></div>
    <div class="example-contents screen">
     <div class="annotation-interactive cdata"><pre>
object(ClassA)#1 (0) {
}
object(ClassB)#1 (0) {
}
object(ClassC)#1 (0) {
}
object(ClassD)#1 (0) {
}

</pre></div>
    </div>
   </div>
   <p class="para">
    Im Kontext einer Klasse ist es möglich, neue Objekte mit
    <code class="literal">new self</code> und <code class="literal">new parent</code> anzulegen.
   </p>
   <p class="para">
    Wenn man eine bereits erzeugte Instanz einer Klasse einer neuen Variablen
    zuweist, wird die neue Variable auf dieselbe Instanz zugreifen wie das
    Objekt, das zugewiesen wurde. Dieses Verhalten ist dasselbe, wenn man
    Instanzen an Funktionen übergibt. Eine Kopie eines bereits erzeugten
    Objekts erhält man, indem man es
    <a href="language.oop5.cloning.php" class="link">klont</a>.
   </p>
   <div class="example" id="example-4">
    <p><strong>Beispiel #5 Objektzuweisung</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">SimpleClass </span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">string $var</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$instanz </span><span style="color: #007700">= new </span><span style="color: #0000BB">SimpleClass</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$zugewiesen   </span><span style="color: #007700">=  </span><span style="color: #0000BB">$instanz</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$referenz     </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$instanz</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$instanz</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">var </span><span style="color: #007700">= </span><span style="color: #DD0000">'$zugewiesen wird diesen Wert haben'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$instanz </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">; </span><span style="color: #FF8000">// $instanz und $referenz werden null<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$instanz</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$referenz</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$zugewiesen</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>
NULL
NULL
object(SimpleClass)#1 (1) {
   [&quot;var&quot;]=&gt;
     string(34) &quot;$zugewiesen wird diesen Wert haben&quot;
}
</pre></div>
    </div>
   </div>
   <p class="para">
    Es gibt mehrere Möglichkeiten, Instanzen eines Objekts zu erzeugen:
   </p>
   <div class="example" id="example-5">
    <p><strong>Beispiel #6 Erzeugen neuer Objekte</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">Test<br /></span><span style="color: #007700">{<br />    public static function </span><span style="color: #0000BB">getNew</span><span style="color: #007700">()<br />    {<br />        return new static();<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Child </span><span style="color: #007700">extends </span><span style="color: #0000BB">Test </span><span style="color: #007700">{}<br /><br /></span><span style="color: #0000BB">$obj1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Durch den Namen der Klasse<br /></span><span style="color: #0000BB">$obj2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">$obj1</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Durch die Variable, die ein Objekt enthält<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj1 </span><span style="color: #007700">!== </span><span style="color: #0000BB">$obj2</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$obj3 </span><span style="color: #007700">= </span><span style="color: #0000BB">Test</span><span style="color: #007700">::</span><span style="color: #0000BB">getNew</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Durch die Methode der Klasse<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj3 </span><span style="color: #007700">instanceof </span><span style="color: #0000BB">Test</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$obj4 </span><span style="color: #007700">= </span><span style="color: #0000BB">Child</span><span style="color: #007700">::</span><span style="color: #0000BB">getNew</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Durch eine Methode der Kindklasse<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>
bool(true)
bool(true)
bool(true)
</pre></div>
    </div>
   </div>
   <p class="para">
    Es ist möglich, auf ein Mitglied eines neu erzeugten Objekts in einem
    einzigen Ausdruck zuzugreifen:
   </p>
   <div class="example" id="example-6">
    <p><strong>Beispiel #7 Zugriff auf ein Mitglied eines neu erzeugten Objekts</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">echo (new </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">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Seit PHP 8.4.0 sind umschließende Klammern optional<br /></span><span style="color: #007700">echo new </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">), </span><span style="color: #0000BB">PHP_EOL</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>
2025
2025
</pre></div>
    </div>
   </div>

   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     Vor PHP 7.1 werden die Argumente nicht ausgewertet, wenn keine
     Konstruktor-Funktion definiert ist.
    </span>
   </p></blockquote>
  </div>

  <div class="sect2" id="language.oop5.basic.properties-methods">
   <h3 class="title">Eigenschaften und Methoden</h3>
   <p class="para">
    Klassen-Eigenschaften und -Methoden leben in separaten &quot;Namensräumen&quot;, so
    dass es eine Eigenschaft und eine Methode desselben Namens geben kann. Der
    Zugriff auf eine Eigenschaft und eine Methode hat die gleiche Schreibweise
    und ob auf eine Eigenschaft zugegriffen oder eine Methode aufgerufen wird,
    hängt einzig und allein vom Kontext ab, d. h. ob die Verwendung ein
    Variablenzugriff oder ein Funktionsaufruf ist.
   </p>
   <div class="example" id="example-7">
    <p><strong>Beispiel #8 Variablenzugriff vs. Methodenaufruf</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">Foo<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$bar </span><span style="color: #007700">= </span><span style="color: #DD0000">'Eigenschaft'</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">bar</span><span style="color: #007700">() {<br />        return </span><span style="color: #DD0000">'Methode'</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">Foo</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">, </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;</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>
Eigenschaft
Methode
</pre></div>
    </div>
   </div>
   <p class="para">
    Das bedeutet, dass der Aufruf einer
    <a href="functions.anonymous.php" class="link">anonymen Funktion</a>, die einer
    Eigenschaft zugewiesen wurde, nicht direkt möglich ist. Stattdessen muss
    beispielsweise die Eigenschaft zunächst einer Variablen zugewiesen werden.
    Es ist möglich, eine solche Eigenschaft direkt aufzurufen, indem man sie in
    Klammern einschließt.
   </p>
   <div class="example" id="example-8">
    <p><strong>Beispiel #9 Aufruf einer anonymen Funktion, die in einer Eigenschaft gespeichert ist</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">Foo<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$bar</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">bar </span><span style="color: #007700">= function() {<br />            return </span><span style="color: #0000BB">42</span><span style="color: #007700">;<br />        };<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">();<br /><br />echo (</span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">)(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;</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>
42
</pre></div>
    </div>
   </div>
  </div>

  <div class="sect2" id="language.oop5.basic.extends">
   
   
   <h3 class="title">extends</h3>
   <p class="para">
    Eine Klasse kann die Konstanten, Methoden und Eigenschaften einer anderen
    Klasse erben, indem man das Schlüsselwort <code class="literal">extends</code> in
    der Deklaration benutzt. Es ist nicht möglich, mehrere Klassen zu
    erweitern; eine Klasse kann nur eine einzige Basisklasse beerben.
   </p>
   <p class="para">
     Die geerbten Konstanten, Methoden und Eigenschaften können überschrieben
     werden, indem sie mit demselben Namen neu deklariert werden, mit dem sie
     in der Elternklasse definiert wurden. Falls die Elternklasse eine Methode
     oder eine Konstante als <a href="language.oop5.final.php" class="link">final</a>
     definiert hat, können diese nicht überschrieben werden. Es ist möglich,
     auf die überschriebenen Methoden oder statischen Eigenschaften
     zuzugreifen, wenn diese mittels
    <a href="language.oop5.paamayim-nekudotayim.php" class="link">parent::</a>
    referenziert werden.
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     Seit PHP 8.1.0 können Konstanten als final deklariert werden.
    </span>
   </p></blockquote>
   <div class="example" id="example-9">
    <p><strong>Beispiel #10 Einfache 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">SimpleClass<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">displayVar</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #DD0000">"Elternklasse\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">ExtendClass </span><span style="color: #007700">extends </span><span style="color: #0000BB">SimpleClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Die Elternmethode überschreiben<br />    </span><span style="color: #007700">function </span><span style="color: #0000BB">displayVar</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #DD0000">"Erweiternde Klasse\n"</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">displayVar</span><span style="color: #007700">();<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$extended </span><span style="color: #007700">= new </span><span style="color: #0000BB">ExtendClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$extended</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">displayVar</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>
Erweiternde Klasse
Elternklasse
</pre></div>
    </div>
   </div>

   <div class="sect3" id="language.oop.lsp">
    <h4 class="title">Regeln zur Signaturkompatibilität</h4>
    <p class="para">
     Wenn eine Methode überschrieben wird, so muss deren Signatur mit derjenigen
     der Elternmethode kompatibel sein. Andernfalls wird ein fataler Fehler
     hervorgerufen oder, vor PHP 8.0.0, eine Warnung der Stufe
     <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> ausgegeben. Eine Signatur ist kompatibel,
     wenn sie die Regeln der <a href="language.oop5.variance.php" class="link">Varianz</a>
     einhält, einen obligatorischen Parameter optional macht, nur neue optionale
     Parameter hinzufügt und die Sichtbarkeit nicht einschränkt, sondern nur
     lockert. Dies ist als das Liskovsche Substitutionsprinzip, kurz LSP,
     bekannt. Der <a href="language.oop5.decon.php#language.oop5.decon.constructor" class="link">Konstruktor</a>
     sowie <code class="literal">private</code> Methoden sind von diesen Regeln zur
     Signaturkompatibilität ausgenommen, weshalb im Fall einer Untimmigkeit in
     der Signatur kein fataler Fehler hervorgerufen wird.
    </p>
    <div class="example" id="example-10">
     <p><strong>Beispiel #11 Kompatible Kindmethoden</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">Base<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">"Gültig\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Extend1 </span><span style="color: #007700">extends </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Extend2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$extended1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Extend1</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$extended1</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$extended2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Extend2</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$extended2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">);</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>
Gültig
Gültig
</pre></div>
     </div>
    </div>

    <p class="para">
     Das folgende Beispiel demonstriert, dass eine Kindmethode nicht zur
     Elternmethode kompatibel ist, wenn sie einen Parameter entfernt oder
     einen optionalen Parameter notwendig macht.
    </p>
    <div class="example" id="example-11">
     <p><strong>Beispiel #12 Fataler Fehler, wenn eine Kindmethode einen Parameter entfernt</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">Base<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">"Gültig\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Extend </span><span style="color: #007700">extends </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br />    }<br />}</span></span></code></div>
     </div>

     <div class="example-contents"><p>Das oben gezeigte Beispiel erzeugt mit PHP 8 eine ähnliche Ausgabe wie:</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Fatal error: Declaration of Extend::foo() must be compatible with Base::foo(int $a = 5) in /in/evtlq on line 13
</pre></div>
     </div>
    </div>
    <div class="example" id="example-12">
     <p><strong>Beispiel #13 Fataler Fehler, wenn eine Kindmethode einen optionalen Parameter notwendig macht</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">Base<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">"Gültig\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Extend </span><span style="color: #007700">extends </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br />    }<br />}</span></span></code></div>
     </div>

     <div class="example-contents"><p>Das oben gezeigte Beispiel erzeugt mit PHP 8 eine ähnliche Ausgabe wie:</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Fatal error: Declaration of Extend::foo(int $a) must be compatible with Base::foo(int $a = 5) in /in/qJXVC on line 13
</pre></div>
     </div>
    </div>

    <div class="warning"><strong class="warning">Warnung</strong>
     <p class="para">
      Die Umbenennung eines Parameters einer Methode in einer Kindklasse führt
      nicht zur Inkompatibilität. Es wird jedoch davon abgeraten, da es zu
      Fehlern der Stufe <span class="classname"><a href="class.error.php" class="classname">Error</a></span> führt, wenn
      <a href="functions.arguments.php#functions.named-arguments" class="link">benannte Parameter</a>
      verwendet werden.
     </p>
     <div class="example" id="example-13">
      <p><strong>Beispiel #14 Fehler, wenn benannte Parameter verwendet und diese in der Kindklasse umbenannt werden</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 </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">$foo</span><span style="color: #007700">, </span><span style="color: #0000BB">$bar</span><span style="color: #007700">) {}<br />}<br /><br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</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">B</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Übergabe der Parameter gemäß den Konventionen von A::test()<br /></span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">foo</span><span style="color: #007700">: </span><span style="color: #DD0000">"foo"</span><span style="color: #007700">, </span><span style="color: #0000BB">bar</span><span style="color: #007700">: </span><span style="color: #DD0000">"bar"</span><span style="color: #007700">); </span><span style="color: #FF8000">// ERROR!</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>
Fatal error: Uncaught Error: Unknown named parameter $foo in /in/XaaeN:14
Stack trace:
#0 {main}
  thrown in /in/XaaeN on line 14
</pre></div>
      </div>
     </div>
    </div>
   </div>
  </div>

  <div class="sect2" id="language.oop5.basic.class.class">
   <h3 class="title">::class</h3>

   <p class="para">
    Das Schlüsselwort <code class="literal">class</code> kann auch für die
    Namensauflösung einer Klasse verwendet werden. Um den vollständig
    qualifizierten Namen der Klasse <code class="literal">ClassName</code> zu erhalten,
    kann <code class="literal">ClassName::class</code> verwendet werden. Dies ist vor
    allem dann praktisch, wenn mit
    <a href="language.namespaces.php" class="link">Namensräumen</a> gearbeitet wird.
   </p>
   <p class="para">
    <div class="example" id="language.oop5.basic.class.class.name">
     <p><strong>Beispiel #15 Auflösung von Klassennamen</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">namespace </span><span style="color: #0000BB">NS </span><span style="color: #007700">{<br />    class </span><span style="color: #0000BB">ClassName </span><span style="color: #007700">{<br />    }<br /><br />    echo </span><span style="color: #0000BB">ClassName</span><span style="color: #007700">::class;<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>
NS\ClassName
</pre></div>
     </div>
    </div>
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Bei der Auflösung des Klassennamens unter Verwendung von
     <code class="literal">::class</code> handelt es sich um eine Transformation zur
     Übersetzungszeit. Das bedeutet, dass zu der Zeit, zu der die
     Klassennamen-Zeichenkette erzeugt wird, noch kein Autoloading erfolgt ist.
     Daraus folgt, dass Klassennamen erweitert werden, selbst wenn die Klasse
     nicht existiert. In diesem Fall wird kein Fehler erzeugt.
    </p>
    <div class="example" id="language.oop5.basic.class.class.fail">
     <p><strong>Beispiel #16 Fehlende Auflösung des Klassennamens</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">print </span><span style="color: #0000BB">Does\Not\Exist</span><span style="color: #007700">::class;<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>
Does\Not\Exist
</pre></div>
     </div>
    </div>
   </p></blockquote>
   <p class="para">
    Von PHP 8.0.0 an kann <code class="literal">::class</code> auch auf Objekte
    angewendet werden. Diese Auflösung des Klassennamens erfolgt nicht zur
    Übersetzungszeit, sondern zur Laufzeit. Sie hat die gleichen Auswirkungen
    wie der Aufruf von <span class="function"><a href="function.get-class.php" class="function">get_class()</a></span> auf das Objekt.
   </p>
   <div class="example" id="language.oop5.basic.class.class.object">
    <p><strong>Beispiel #17 Namensauflösung eines Objekts</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">namespace </span><span style="color: #0000BB">NS </span><span style="color: #007700">{<br />    class </span><span style="color: #0000BB">ClassName </span><span style="color: #007700">{<br />    }<br /><br />    </span><span style="color: #0000BB">$c </span><span style="color: #007700">= new </span><span style="color: #0000BB">ClassName</span><span style="color: #007700">();<br />    print </span><span style="color: #0000BB">$c</span><span style="color: #007700">::class;<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>
NS\ClassName
</pre></div>
    </div>
   </div>
  </div>
  <div class="sect2" id="language.oop5.basic.nullsafe">
   <h3 class="title">Nullsafe-Methoden und -Eigenschaften</h3>
   <p class="para">
    Von PHP 8.0.0 an kann auf Eigenschaften und Methoden stattdessen auch mit
    dem &quot;Nullsafe&quot;-Operator zugegriffen werden: <code class="literal">?-&gt;</code>. Der
    Nullsafe-Operator funktioniert genauso als Eigenschafts- oder
    Methodenzugriff wie oben, mit dem Unterschied, dass <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> zurückgegeben
    wird, statt dass eine Exception erzeugt wird, wenn das Objekt, das
    dereferenziert wird, <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> ist. Wenn die Dereferenzierung Teil einer
    Zeichenkette ist, wird der Rest der Zeichenkette übersprungen.
   </p>
   <p class="para">
    Der Effekt ist ähnlich, wie wenn man jeden Zugriff zuerst mit
    <span class="function"><a href="function.is-null.php" class="function">is_null()</a></span> prüft, aber kompakter.
   </p>
   <p class="para">
    <div class="example" id="example-14">
     <p><strong>Beispiel #18 Nullsafe Operator</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">// Von PHP 8.0.0 an entspricht diese Zeile:<br /></span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">$repository</span><span style="color: #007700">?-&gt;</span><span style="color: #0000BB">getUser</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">)?-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// dem folgenden Codeblock:<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">is_null</span><span style="color: #007700">(</span><span style="color: #0000BB">$repository</span><span style="color: #007700">)) {<br />    </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br />} else {<br />    </span><span style="color: #0000BB">$user </span><span style="color: #007700">= </span><span style="color: #0000BB">$repository</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getUser</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">);<br />    if (</span><span style="color: #0000BB">is_null</span><span style="color: #007700">(</span><span style="color: #0000BB">$user</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br />    } else {<br />        </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">$user</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br />    }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Der Nullsafe-Operator wird am besten verwendet, wenn Null ein gültiger
     und potenziell erwarteter möglicher Rückgabewert für eine Eigenschaft
     oder eine Methode ist. Um einen Fehler anzuzeigen, ist die Erzeugung
     einer Exception vorzuziehen.
    </p>
   </p></blockquote>
  </div>
 </div><?php manual_footer($setup); ?>