<?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.late-static-bindings.php',
    1 => 'Sp&auml;te statische Bindung',
    2 => 'Sp&auml;te statische Bindung',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Klassen und Objekte',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.object-comparison.php',
    1 => 'Objekte vergleichen',
  ),
  'next' => 
  array (
    0 => 'language.oop5.references.php',
    1 => 'Objekte und Referenzen',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'language/oop5/late-static-bindings.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.late-static-bindings" class="sect1">
  <h2 class="title">Späte statische Bindung</h2>
  <p class="para">
   PHP unterstützt späte statische Bindung (&quot;Late static binding&quot;). Hiermit
   kann die aufgerufene Klasse im Kontext statischer Vererbung referenziert
   werden.
  </p>

  <p class="para">
   Genauer gesagt funktioniert späte statische Bindung durch das Speichern der
   Klasse, die im letzten &quot;nicht weiterleitenden Aufruf&quot; angegeben wurde. Im
   Fall von statischen Methodenaufrufen ist dies die explizit angegebene
   Klasse (üblicherweise diejenige auf der linken Seite des Operators
   <a href="language.oop5.paamayim-nekudotayim.php" class="link"><code class="literal">::</code></a>);
   im Fall von nicht statischen Methodenaufrufen ist es die Klasse des
   Objekts. Ein &quot;weiterleitender Aufruf&quot; ist ein statischer, der durch
   <code class="literal">self::</code>, <code class="literal">parent::</code>,
   <code class="literal">static::</code> oder, in der Klassenhierarchie nach oben
   gehend, durch <span class="function"><a href="function.forward-static-call.php" class="function">forward_static_call()</a></span> eingeleitet wurde.
   

   Die Funktion <span class="function"><a href="function.get-called-class.php" class="function">get_called_class()</a></span> kann benutzt werden,
   um eine Zeichenkette mit dem Namen der aufgerufenen Klasse abzufragen,
   und <code class="literal">static::</code> führt ihren Geltungsbereich ein.
  </p>

  <p class="para">
   Diese Funktionalität wurde in Hinblick auf die interne Perspektive als
   &quot;späte statische Bindung&quot; benannt. &quot;Späte Bindung&quot; bezieht sich auf die
   Tatsache, dass <code class="literal">static::</code> nicht über die Klasse, in der
   die aufgerufene Methode definiert ist, aufgelöst wird, stattdessen wird
   diese mit Hilfe von Laufzeitinformationen bestimmt.

   Die Benennung als &quot;statische Bindung&quot; beruht darauf, dass dieser Mechanismus
   unter anderem für statische Methodenaufrufe genutzt werden kann.
  </p>

  <div class="sect2" id="language.oop5.late-static-bindings.self">
   <h3 class="title">Beschränkungen von <code class="literal">self::</code></h3>
   <p class="para">
    Statische Referenzen auf die aktuelle Klasse wie <code class="literal">self::</code>
    oder <code class="literal">__CLASS__</code> werden mit Hilfe der Klasse, zu der die
    Methode gehört, also in welcher sie definiert ist, aufgelöst.
   </p>
   <div class="example" id="example-1">
    <p><strong>Beispiel #1 Nutzung von <code class="literal">self::</code></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 static function </span><span style="color: #0000BB">who</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #0000BB">__CLASS__</span><span style="color: #007700">;<br />    }<br /><br />    public static function </span><span style="color: #0000BB">test</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">who</span><span style="color: #007700">();<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    public static function </span><span style="color: #0000BB">who</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #0000BB">__CLASS__</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">test</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Das oben gezeigte Beispiel erzeugt folgende Ausgabe:</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
A
</pre></div>
    </div>
   </div>

  </div>

  <div class="sect2" id="language.oop5.late-static-bindings.usage">
   <h3 class="title">Nutzung später statischer Bindung</h3>

   <p class="para">
    Späte statische Bindung versucht diese Beschränkung zu umgehen, indem ein
    neues Schlüsselwort eingeführt wird, das die Klasse referenziert, die
    tatsächlich zur Laufzeit genutzt wurde. Im Grunde genommen also ein
    Schlüsselwort, das es im vorherigen Beispiel ermöglicht die Klasse
    <code class="literal">B</code> aus der aufgerufenen Methode
    <code class="literal">test()</code> zu referenzieren. Es wurde entschieden, kein
    neues Schlüsselwort einzuführen, sondern statt dessen
    <code class="literal">static</code> zu verwenden, das bereits als reserviertes
    Schlüsselwort existierte.
   </p>

   <div class="example" id="example-2">
    <p><strong>Beispiel #2 Einfache Nutzung von <code class="literal">static::</code></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 static function </span><span style="color: #0000BB">who</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #0000BB">__CLASS__</span><span style="color: #007700">;<br />    }<br /><br />    public static function </span><span style="color: #0000BB">test</span><span style="color: #007700">()<br />    {<br />        static::</span><span style="color: #0000BB">who</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Hier kommt die späte statische Bindung<br />    </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<br /></span><span style="color: #007700">{<br />    public static function </span><span style="color: #0000BB">who</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #0000BB">__CLASS__</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">test</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Das oben gezeigte Beispiel erzeugt folgende Ausgabe:</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
B
</pre></div>
    </div>
   </div>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     In nicht statischen Kontexten ist die aufgerufene Klasse die Klasse des
     Objekt-Exemplars. Da <code class="literal">$this-&gt;</code> versucht private Methoden
     im gleichen Geltungsbereich aufzurufen, kann die Verwendung von
     <code class="literal">static::</code> andere Ergebnisse liefern. Ein weiterer
     Unterschied ist, dass <code class="literal">static::</code> sich nur auf statische
     Eigenschaften beziehen kann.
    </p>
   </p></blockquote>
   <div class="example" id="example-3">
    <p><strong>Beispiel #3 Nutzung von <code class="literal">static::</code> außerhalb eines statischen Kontexts</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 />    private function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #DD0000">"Erfolg!\n"</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">test</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">();<br />        static::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">/* foo() wird nach B kopiert, weshalb ihr Geltungsbereich immer noch A ist<br />    * und der Aufruf erfolgreich sein wird */<br /></span><span style="color: #007700">}<br /><br />class </span><span style="color: #0000BB">C </span><span style="color: #007700">extends </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    private function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #FF8000">/* ursprüngliche Methode wird ersetzt; der Geltungsbereich der neuen ist C */<br />    </span><span style="color: #007700">}<br />}<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">test</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">= new </span><span style="color: #0000BB">C</span><span style="color: #007700">();<br />try {<br />    </span><span style="color: #0000BB">$c</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">test</span><span style="color: #007700">();<br />} catch (</span><span style="color: #0000BB">Error $e</span><span style="color: #007700">) {<br />    echo </span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">();<br />}<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>
Erfolg!
Erfolg!
Erfolg!
Call to private method C::foo() from scope A
</pre></div>
    </div>
   </div>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Die Auflösung später statischer Bindungen endet mit einem vollständig
     aufgelösten statischen Aufruf ohne Alternative. Statische Aufrufe, die
     Schlüsselworte wie <code class="literal">parent::</code> oder <code class="literal">self::</code>
     nutzen, geben dagegen die Aufrufinformationen weiter.
    </p>
    <div class="example" id="example-4">
     <p><strong>Beispiel #4 Weitergegebene und nicht weitergegebene Aufrufe</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 static function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />    {<br />        static::</span><span style="color: #0000BB">who</span><span style="color: #007700">();<br />    }<br /><br />    public static function </span><span style="color: #0000BB">who</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #0000BB">__CLASS__ </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    public static function </span><span style="color: #0000BB">test</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 />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br />        </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br />    }<br /><br />    public static function </span><span style="color: #0000BB">who</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #0000BB">__CLASS__ </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">C </span><span style="color: #007700">extends </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br />    public static function </span><span style="color: #0000BB">who</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #0000BB">__CLASS__ </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">C</span><span style="color: #007700">::</span><span style="color: #0000BB">test</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <div class="example-contents"><p>Das oben gezeigte Beispiel erzeugt folgende Ausgabe:</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
A
C
C
</pre></div>
     </div>
    </div>
   </p></blockquote>
  </div>
 </div><?php manual_footer($setup); ?>