<?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.traits.php',
    1 => 'Traits',
    2 => 'Traits',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Klassen und Objekte',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.interfaces.php',
    1 => 'Objekt-Interfaces (Schnittstellen)',
  ),
  'next' => 
  array (
    0 => 'language.oop5.anonymous.php',
    1 => 'Anonyme Klassen',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'language/oop5/traits.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.traits" class="sect1">
  <h2 class="title">Traits</h2>
  <p class="para">
   In PHP gibt es eine Methode der Wiederverwendung von Code, die Traits
   genannt wird.
  </p>
  <p class="para">
   Traits sind ein Mechanismus zur Wiederverwendung von Code, der in
   Programmiersprachen mit einfacher Vererbung wie PHP verwendet wird. Ein
   Trait kann verwendet werden, um den Beschränkungen der einfachen Vererbung
   auszuweichen, indem er erlaubt, dass Mengen von Methoden frei in
   mehreren unabhängigen Klassen, die in verschiedenen Klassenhierarchien
   stecken, wiederzuverwenden. Die Semantik der Kombination von Traits und
   Klassen ist so definiert, dass die Komplexität reduziert wird und die
   üblichen Probleme vermeidet, die mit Mehrfachvererbung und Mixins in
   Verbindung gebracht werden.
  </p>
  <p class="para">
   Ein Trait hat Ähnlichkeit mit einer Klasse, ist aber nur dafür vorgesehen,
   Funktionalität in einer feingranularen und konsistenten Art und Weise zu
   bündeln. Es ist nicht möglich einen Trait alleinstehend zu instantiieren.
   Es handelt sich um einen Zusatz zur traditionellen Vererbung und erlaubt
   horizontale Komposition von Verhaltensweisen, d. h. die Verwendung von
   Klassenmethoden ohne Vererbung vorauszusetzen.
  </p>

  <div class="example" id="language.oop5.traits.basicexample">
    <p><strong>Beispiel #1 Trait-Beispiel</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">trait </span><span style="color: #0000BB">TraitA </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sayHello</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'Hello'</span><span style="color: #007700">;<br />    }<br />}<br /><br />trait </span><span style="color: #0000BB">TraitB </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sayWorld</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'World'</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">MyHelloWorld<br /></span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">TraitA</span><span style="color: #007700">, </span><span style="color: #0000BB">TraitB</span><span style="color: #007700">; </span><span style="color: #FF8000">// Eine Klasse kann mehrere Traits verwenden<br /><br />    </span><span style="color: #007700">public function </span><span style="color: #0000BB">sayHelloWorld</span><span style="color: #007700">() {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sayHello</span><span style="color: #007700">();<br />        echo </span><span style="color: #DD0000">' '</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sayWorld</span><span style="color: #007700">();<br />        echo </span><span style="color: #DD0000">"!\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$myHelloWorld </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyHelloWorld</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$myHelloWorld</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sayHelloWorld</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>
Hello World!
</pre></div>
    </div>
   </div>

  <div class="sect2" id="language.oop5.traits.precedence">
   <h3 class="title">Rangfolge</h3>
   <p class="para">
    Methoden der aktuellen Klasse überschreiben Methoden, welche von Traits
    definiert wurden. Jene wiederum überschreiben von Elternklassen geerbte
    Methoden.
   </p>
   <div class="example" id="language.oop5.traits.precedence.examples.ex1">
    <p><strong>Beispiel #2 Rangfolge-Beispiel</strong></p>
    <div class="example-contents"><p>
     Die Methode <code class="literal">sayHello</code> der Basisklasse wird durch die
     gleichnamige Methode aus dem Trait überschrieben.
    </p></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">class </span><span style="color: #0000BB">Base </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sayHello</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'Hallo '</span><span style="color: #007700">;<br />    }<br />}<br /><br />trait </span><span style="color: #0000BB">SayWorld </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sayHello</span><span style="color: #007700">() {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">sayHello</span><span style="color: #007700">();<br />        echo </span><span style="color: #DD0000">'Welt!'</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">MyHelloWorld </span><span style="color: #007700">extends </span><span style="color: #0000BB">Base </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">SayWorld</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$o </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyHelloWorld</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$o</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sayHello</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 Welt!
</pre></div>
    </div>
   </div>
   <div class="example" id="language.oop5.traits.precedence.examples.ex2">
    <p><strong>Beispiel #3 Weiteres Beispiel für Rangfolge</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">trait </span><span style="color: #0000BB">HelloWorld </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sayHello</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'Hallo Welt!'</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">TheWorldIsNotEnough </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">HelloWorld</span><span style="color: #007700">;<br />    public function </span><span style="color: #0000BB">sayHello</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'Hallo Universum!'</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$o </span><span style="color: #007700">= new </span><span style="color: #0000BB">TheWorldIsNotEnough</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$o</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sayHello</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 Universum!
</pre></div>
    </div>
   </div>
  </div>

  <div class="sect2" id="language.oop5.traits.multiple">
   <h3 class="title">Mehrere Traits</h3>
   <p class="para">
    Mehrere Traits können durch eine kommaseparierte Auflistung im
    <code class="literal">use</code>-Statement zu einer Klasse hinzugefügt werden.
   </p>
   <div class="example" id="language.oop5.traits.multiple.ex1">
    <p><strong>Beispiel #4 Verwendung mehrerer Traits</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">trait </span><span style="color: #0000BB">Hello </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sayHello</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'Hallo '</span><span style="color: #007700">;<br />    }<br />}<br /><br />trait </span><span style="color: #0000BB">World </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sayWorld</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">' Welt'</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">MyHelloWorld </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">Hello</span><span style="color: #007700">, </span><span style="color: #0000BB">World</span><span style="color: #007700">;<br />    public function </span><span style="color: #0000BB">sayExclamationMark</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'!'</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$o </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyHelloWorld</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$o</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sayHello</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$o</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sayWorld</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$o</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sayExclamationMark</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 Welt!
</pre></div>
    </div>
   </div>
  </div>

  <div class="sect2" id="language.oop5.traits.conflict">
   <h3 class="title">Konfliktauflösung</h3>
   <p class="para">
    Falls zwei Traits eine Methode mit gleichem Namen einfügen, so wird ein
    Fatal Error erzeugt, wenn der Konflikt nicht explizit aufgelöst wird.
   </p>
   <p class="para">
    Um einen Namenskonflikt zwischen Traits in der gleichen Klasse aufzulösen
    muss der <code class="literal">insteadof</code>-Operator verwendet werden, um
    genau eine der Methoden des Konflikts auszuwählen.
   </p>
   <p class="para">
    Da dies es nur erlaubt Methoden auszuschließen kann der
    <code class="literal">as</code>-Operator verwendet werden, um einen Alias zu einer der
    Methoden hinzuzufügen. Es ist zu beachten, dass der <code class="literal">as</code>
    Operator die Methode nicht umbenennt, und auch keine andere Methode
    beeinflusst.
   </p>
   <div class="example" id="language.oop5.traits.conflict.ex1">
    <p><strong>Beispiel #5 Konfliktauflösung</strong></p>
    <div class="example-contents"><p>
      In diesem Beispiel verwendet die Klasse Talker die Traits A und B.
      Nachdem A und B sich widersprechende Methoden besitzen definiert die
      Klasse, dass sie die Variante von smallTalk aus dem Trait B und die
      Variante von bigTalk des Traits A verwenden möchte.
    </p></div>
    <div class="example-contents"><p>
      Die Klasse Aliased_Talker verwendet den <code class="literal">as</code>-Operator,
      damit sie außerdem die Implementierung der bigTalk-Methode von B unter dem
      Alias <code class="literal">talk</code> verwenden kann.
    </p></div>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">trait </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">smallTalk</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'a'</span><span style="color: #007700">;<br />    }<br />    public function </span><span style="color: #0000BB">bigTalk</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'A'</span><span style="color: #007700">;<br />    }<br />}<br /><br />trait </span><span style="color: #0000BB">B </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">smallTalk</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'b'</span><span style="color: #007700">;<br />    }<br />    public function </span><span style="color: #0000BB">bigTalk</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'B'</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Talker </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">A</span><span style="color: #007700">, </span><span style="color: #0000BB">B </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">smallTalk </span><span style="color: #007700">insteadof </span><span style="color: #0000BB">A</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">bigTalk </span><span style="color: #007700">insteadof </span><span style="color: #0000BB">B</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Aliased_Talker </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">A</span><span style="color: #007700">, </span><span style="color: #0000BB">B </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">smallTalk </span><span style="color: #007700">insteadof </span><span style="color: #0000BB">A</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">bigTalk </span><span style="color: #007700">insteadof </span><span style="color: #0000BB">B</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">bigTalk </span><span style="color: #007700">as </span><span style="color: #0000BB">talk</span><span style="color: #007700">;<br />    }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>

  <div class="sect2" id="language.oop5.traits.visibility">
   <h3 class="title">Veränderung der Sichtbarkeit von Methoden</h3>
   <p class="para">
    Mit der <code class="literal">as</code>-Syntax ist es ebenso möglich, die
    Sichtbarkeit einer Methode in der darstellenden Klasse zu verändern.
   </p>
   <div class="example" id="language.oop5.traits.visibility.ex1">
    <p><strong>Beispiel #6 Veränderung der Sichtbarkeit von Methoden</strong></p>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">trait </span><span style="color: #0000BB">HelloWorld </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sayHello</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'Hallo Welt!'</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #FF8000">// Ändern der Sichtbarkeit von sayHello<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass1 </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">HelloWorld </span><span style="color: #007700">{ </span><span style="color: #0000BB">sayHello </span><span style="color: #007700">as protected; }<br />}<br /><br /></span><span style="color: #FF8000">// Alias der Methode mit geänderter Sichtbarkeit<br />// Die Sichtbarkeit von sayHello bleibt unverändert<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass2 </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">HelloWorld </span><span style="color: #007700">{ </span><span style="color: #0000BB">sayHello </span><span style="color: #007700">as private </span><span style="color: #0000BB">myPrivateHello</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.traits.composition">
   <h3 class="title">Trait-Zusammensetzung aus Traits</h3>
   <p class="para">
    Ebenso wie Klassen können auch Traits andere Traits verwenden. Indem
    man einen oder mehrere Traits in einer Traitdefinition verwendet kann man
    Traits entweder teilweise oder vollständig aus Methoden, welche in anderen
    Traits definiert sind, zusammensetzen.
   </p>
   <div class="example" id="language.oop5.traits.composition.ex1">
    <p><strong>Beispiel #7 Trait-Zusammensetzung aus Traits</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">trait </span><span style="color: #0000BB">Hello </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sayHello</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'Hallo '</span><span style="color: #007700">;<br />    }<br />}<br /><br />trait </span><span style="color: #0000BB">World </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sayWorld</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'Welt!'</span><span style="color: #007700">;<br />    }<br />}<br /><br />trait </span><span style="color: #0000BB">HelloWorld </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">Hello</span><span style="color: #007700">, </span><span style="color: #0000BB">World</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">MyHelloWorld </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">HelloWorld</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$o </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyHelloWorld</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$o</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sayHello</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$o</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sayWorld</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 Welt!
</pre></div>
    </div>
   </div>
  </div>

  <div class="sect2" id="language.oop5.traits.abstract">
   <h3 class="title">Abstrakte Traitmember</h3>
   <p class="para">
    Traits unterstützen auch die Verwendung von abstrakten Methoden, um
    darstellenden Klassen Anforderungen vorzugeben. Es werden öffentliche,
    geschützte und private Methoden unterstützt. Vor PHP 8.0.0 wurden nur
    öffentliche und geschützte abstrakte Methoden unterstützt.
   </p>
   <div class="caution"><strong class="caution">Achtung</strong>
    <p class="simpara">
     Seit PHP 8.0.0 muss die Signatur einer konkreten Methode den
     <a href="language.oop5.basic.php#language.oop.lsp" class="link">Regeln zur Signaturkompatibilität</a>
     entsprechen; zuvor durfte ihre Signatur davon abweichen.
    </p>
   </div>
   <div class="example" id="language.oop5.traits.abstract.ex1">
    <p><strong>Beispiel #8 Ausdrücken von Anforderungen durch abstrakte Methoden</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">trait </span><span style="color: #0000BB">Hello </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sayHelloWorld</span><span style="color: #007700">() {<br />       echo </span><span style="color: #DD0000">'Hallo'</span><span style="color: #007700">.</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getWorld</span><span style="color: #007700">();<br />    }<br />    abstract public function </span><span style="color: #0000BB">getWorld</span><span style="color: #007700">();<br />}<br /><br />class </span><span style="color: #0000BB">MyHelloWorld </span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$world</span><span style="color: #007700">;<br />    use </span><span style="color: #0000BB">Hello</span><span style="color: #007700">;<br />    public function </span><span style="color: #0000BB">getWorld</span><span style="color: #007700">() {<br />        return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">world</span><span style="color: #007700">;<br />    }<br />    public function </span><span style="color: #0000BB">setWorld</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">world </span><span style="color: #007700">= </span><span style="color: #0000BB">$val</span><span style="color: #007700">;<br />    }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>

  <div class="sect2" id="language.oop5.traits.static">
   <h3 class="title">Statische Traitmember</h3>
   <p class="para">
    Traits unterstützen sowohl statische Variablen, statische Methoden und
    statische Eignschaften.
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Seit PHP 8.1.0 sind der Aufruf einer statischen Methode oder der Zugriff
     auf eine statische Eigenschaft direkt in einem Trait veraltet. Auf
     statische Methoden und Eigenschaften sollte nur in einer Klasse
     zugegriffen werden, die den Trait verwendet.
    </p>
   </p></blockquote>
   <div class="example" id="language.oop5.traits.static.ex1">
    <p><strong>Beispiel #9 Statische Variablen</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">trait </span><span style="color: #0000BB">Counter<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">inc</span><span style="color: #007700">()<br />    {<br />        static </span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">$c </span><span style="color: #007700">+ </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />        echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$c</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">C1<br /></span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">Counter</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">C2<br /></span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">Counter</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$o </span><span style="color: #007700">= new </span><span style="color: #0000BB">C1</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$o</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">inc</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$p </span><span style="color: #007700">= new </span><span style="color: #0000BB">C2</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">inc</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>
1
1
</pre></div>
    </div>
   </div>
   <div class="example" id="language.oop5.traits.static.ex2">
    <p><strong>Beispiel #10 Statische Methoden</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">trait </span><span style="color: #0000BB">StaticExample<br /></span><span style="color: #007700">{<br />    public static function </span><span style="color: #0000BB">doSomething</span><span style="color: #007700">()<br />    {<br />        return </span><span style="color: #DD0000">'Tue etwas'</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Example<br /></span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">StaticExample</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #0000BB">Example</span><span style="color: #007700">::</span><span style="color: #0000BB">doSomething</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>
Doing something
</pre></div>
    </div>
   </div>
   <div class="example" id="language.oop5.traits.static.ex3">
    <p><strong>Beispiel #11 Statische Eigenschaften</strong></p>
    <div class="caution"><strong class="caution">Achtung</strong>
     <p class="simpara">
      Vor PHP 8.3.0 wurden statische Eigenschaften, die in einem Trait
      definiert waren, von allen Klassen in derselben Vererbungshierarchie, die
      diesen Trait verwendeten, gemeinsam genutzt.
      Seit PHP 8.3.0 wird eine statische Eigenschaft, die von einer Kindklasse
      über einen Trait verwendet wird, als von der in der Elternklasse
      definierte Eigenschaft unterschieden betrachtet.
     </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">trait </span><span style="color: #0000BB">T<br /></span><span style="color: #007700">{<br />    public static </span><span style="color: #0000BB">$counter </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">T</span><span style="color: #007700">;<br /><br />    public static function </span><span style="color: #0000BB">incrementCounter</span><span style="color: #007700">()<br />    {<br />        static::</span><span style="color: #0000BB">$counter</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 />    use </span><span style="color: #0000BB">T</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">incrementCounter</span><span style="color: #007700">();<br /><br />echo </span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">$counter</span><span style="color: #007700">, </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">$counter</span><span style="color: #007700">, </span><span style="color: #DD0000">"\n"</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 mit PHP 8.3 folgende Ausgabe:</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
2
1
</pre></div>
    </div>
   </div>
  </div>

  <div class="sect2" id="language.oop5.traits.properties">
   <h3 class="title">Eigenschaften</h3>
   <p class="para">
    Traits können ebenfalls Eigenschaften definieren.
   </p>
   <div class="example" id="language.oop5.traits.properties.example">
    <p><strong>Beispiel #12 Eigenschaften definieren</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">trait </span><span style="color: #0000BB">PropertiesTrait<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$x </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">PropertiesExample<br /></span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">PropertiesTrait</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$example </span><span style="color: #007700">= new </span><span style="color: #0000BB">PropertiesExample</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$example</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">x</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">
    Definiert ein Trait eine Eigenschaft, dann kann eine Klasse keine Eigenschaft
    mit dem selben Namen definieren, es sei denn, sie ist kompatibel (selbe
    Sichtbarkeit und Typ, readonly-Modifikator und Initialwert); andernfalls wird
    ein fataler Fehler auftreten.
   </p>
   <div class="example" id="language.oop5.traits.properties.conflicts">
    <p><strong>Beispiel #13 Konfliktauflösung</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">trait </span><span style="color: #0000BB">PropertiesTrait </span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$same </span><span style="color: #007700">= </span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />    public </span><span style="color: #0000BB">$different1 </span><span style="color: #007700">= </span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />    public </span><span style="color: #0000BB">bool $different2</span><span style="color: #007700">;<br />    public </span><span style="color: #0000BB">bool $different3</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">PropertiesExample </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">PropertiesTrait</span><span style="color: #007700">;<br />    public </span><span style="color: #0000BB">$same </span><span style="color: #007700">= </span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />    public </span><span style="color: #0000BB">$different1 </span><span style="color: #007700">= </span><span style="color: #0000BB">true</span><span style="color: #007700">; </span><span style="color: #FF8000">// Fatal error<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $different2</span><span style="color: #007700">; </span><span style="color: #FF8000">// Fatal error<br />    </span><span style="color: #007700">readonly protected </span><span style="color: #0000BB">bool $different3</span><span style="color: #007700">; </span><span style="color: #FF8000">// Fatal error<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>

 <div class="sect2" id="language.oop5.traits.constants">
  <h3 class="title">Konstanten</h3>
  <p class="para">
   Seit PHP 8.2.0 können Traits auch Konstanten definieren.
  </p>
  <div class="example" id="language.oop5.traits.constants.example">
   <p><strong>Beispiel #14 Definieren von Konstanten</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">trait </span><span style="color: #0000BB">ConstantsTrait </span><span style="color: #007700">{<br />    public const </span><span style="color: #0000BB">FLAG_MUTABLE </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />    final public const </span><span style="color: #0000BB">FLAG_IMMUTABLE </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">ConstantsExample </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">ConstantsTrait</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$example </span><span style="color: #007700">= new </span><span style="color: #0000BB">ConstantsExample</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">$example</span><span style="color: #007700">::</span><span style="color: #0000BB">FLAG_MUTABLE</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>
1
</pre></div>
    </div>
  </div>
  <p class="para">
   Wenn ein Trait eine Konstante definiert, kann eine Klasse keine Konstante
   mit demselben Namen definieren, es sei denn, sie ist kompatibel (dieselbe
   Sichtbarkeit, derselbe Initialwert und dieselbe Finalität), andernfalls
   wird ein fataler Fehler ausgegeben.
  </p>
  <div class="example" id="language.oop5.traits.constants.conflicts">
   <p><strong>Beispiel #15 Konfliktauflösung</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">trait </span><span style="color: #0000BB">ConstantsTrait </span><span style="color: #007700">{<br />    public const </span><span style="color: #0000BB">FLAG_MUTABLE </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />    final public const </span><span style="color: #0000BB">FLAG_IMMUTABLE </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">ConstantsExample </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">ConstantsTrait</span><span style="color: #007700">;<br />    public const </span><span style="color: #0000BB">FLAG_IMMUTABLE </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">; </span><span style="color: #FF8000">// Fatal error<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="language.oop5.traits.final-methods">
  <h3 class="title">Finale Methoden</h3>
  <p class="simpara">
   Seit PHP 8.3.0 kann der Modifikator
   <a href="language.oop5.final.php" class="link">final</a> mit dem Operator
   <code class="literal">as</code> auf Methoden angewendet werden, die aus Traits
   importiert wurden. Dies kann verwendet werden, um zu verhindern, dass
   Kindklassen die Methode überschreiben. Die Klasse, die den Trait verwendet,
   kann die Methode jedoch weiterhin überschreiben.
  </p>
  <div class="example" id="language.oop5.traits.final-methods.example">
   <p><strong>Beispiel #16 Definieren einer Methode aus einem Trait als <code class="literal">final</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">trait </span><span style="color: #0000BB">CommonTrait<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">method</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #DD0000">'Hello'</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">FinalExampleA<br /></span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">CommonTrait </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">CommonTrait</span><span style="color: #007700">::</span><span style="color: #0000BB">method </span><span style="color: #007700">as final; </span><span style="color: #FF8000">// Das "final" verhindert, dass Kindklassen<br />                                      // die Methode überschreiben.<br />    </span><span style="color: #007700">}<br />}<br /><br />class </span><span style="color: #0000BB">FinalExampleB </span><span style="color: #007700">extends </span><span style="color: #0000BB">FinalExampleA<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">method</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
eine ähnliche Ausgabe wie:</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Fatal error: Cannot override final method FinalExampleA::method() in ...
</pre></div>
    </div>
  </div>
 </div>

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