<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.operators.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'language.operators.precedence.php',
    1 => 'Operator-Rangfolge',
    2 => 'Operator-Rangfolge',
  ),
  'up' => 
  array (
    0 => 'language.operators.php',
    1 => 'Operatoren',
  ),
  'prev' => 
  array (
    0 => 'language.operators.php',
    1 => 'Operatoren',
  ),
  'next' => 
  array (
    0 => 'language.operators.arithmetic.php',
    1 => 'Arithmetisch',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'language/operators/precedence.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.operators.precedence" class="sect1">
 <h2 class="title">Operator-Rangfolge</h2>
 
 <p class="para">
  Die Operator-Rangfolge legt fest, wie &quot;eng&quot; ein Operator zwei Ausdrücke
  miteinander verbindet. Zum Beispiel ist das Ergebnis des Ausdruckes
  <code class="literal">1 + 5 * 3</code> <code class="literal">16</code> und nicht
  <code class="literal">18</code>, da der Multiplikations-Operator (&quot;*&quot;) in der
  Rangfolge höher steht als der Additions-Operator (&quot;+&quot;). Wenn nötig, können
  Sie Klammern setzen, um die Rangfolge der Operatoren zu beeinflussen. Zum
  Beispiel ergibt: <code class="literal">(1 + 5) * 3</code> <code class="literal">18</code>.
 </p>
 <p class="para">
  Haben Operatoren die gleiche Rangfolge, dann entscheidet ihre Assoziativität
  wie die Operatoren gruppiert werden. Zum Beispiel ist &quot;-&quot; links-assoziativ,
  sodass <code class="literal">1 - 2 - 3</code> als <code class="literal">(1 - 2) - 3</code>
  gruppiert und zu <code class="literal">-4</code> ausgewertet wird. Andererseits ist
  &quot;=&quot; rechts-assoziativ, sodass <code class="literal">$a = $b = $c</code> als
  <code class="literal">$a = ($b = $c)</code> gruppiert wird.
 </p>
 <p class="para">
  Operatoren gleicher Rangfolge, die nicht-assoziativ sind, können nicht
  nebeneinander verwendet werden; beispielsweise ist <code class="literal">1 &lt; 2 &gt;
  1</code> in PHP nicht erlaubt. Der Ausdruck <code class="literal">1 &lt;= 1 ==
  1</code> ist allerdings erlaubt, weil der Operator <code class="literal">==</code>
  eine niedrigere Rangfolge als der Operator <code class="literal">&lt;</code> hat.
 </p>
 <p class="para">
  Assoziativität ist nur für binäre (und ternäre) Operatoren sinnvoll. Unäre
  Operatoren sind entweder Präfix oder Postfix, sodass dieser Begriff nicht
  anwendbar ist. Zum Beispiel kann <code class="literal">!!$a</code> nur als
  <code class="literal">!(!$a)</code> gruppiert werden.
 </p>
 <p class="para">
  Die Verwendung von Klammern, auch wenn sie nicht unbedingt erforderlich
  sind, kann oft die Lesbarkeit des Codes verbessern, indem explizit gruppiert
  wird, statt sich auf die implizite Operator-Rangfolge und -Assoziativität zu
  verlassen.
 </p>
 <p class="para">
  Die folgende Tabelle zeigt die Rangfolge der Operatoren, oben steht der
  Operator mit dem höchsten Rang. Operatoren in derselben Zeile haben die
  gleiche Rangfolge, sodass ihre Assoziativität die Gruppierung entscheidet.
  <table class="doctable table">
   <caption><strong>Operator-Rangfolge</strong></caption>
   
    <thead>
     <tr>
      <th>Assoziativität</th>
      <th>Operatoren</th>
      <th>Additional Information</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>(n. z.)</td>
      <td>
       <code class="literal">clone</code>
       <code class="literal">new</code>
      </td>
      <td>
       <a href="language.oop5.cloning.php" class="link">clone</a> und
       <a href="language.oop5.basic.php#language.oop5.basic.new" class="link">new</a>
      </td>
     </tr>

     <tr>
      <td>rechts</td>
      <td><code class="literal">**</code></td>
      <td><a href="language.operators.arithmetic.php" class="link">arithmetisch</a></td>
     </tr>

     <tr>
      <td>(n. z.)</td>
      <td>
       <code class="literal">+</code>
       <code class="literal">-</code>
       <code class="literal">++</code>
       <code class="literal">--</code>
       <code class="literal">~</code>
       <code class="literal">(int)</code>
       <code class="literal">(float)</code>
       <code class="literal">(string)</code>
       <code class="literal">(array)</code>
       <code class="literal">(object)</code>
       <code class="literal">(bool)</code>
       <code class="literal">@</code>
      </td>
      <td>
       <a href="language.operators.arithmetic.php" class="link">arithmetisch</a> (unär
       <code class="literal">+</code> und <code class="literal">-</code>),
       <a href="language.operators.increment.php" class="link">inkrementell/dekrementell</a>,
       <a href="language.operators.bitwise.php" class="link">bitweise</a>,
       <a href="language.types.type-juggling.php#language.types.typecasting" class="link">Typumwandlung</a> und
       <a href="language.operators.errorcontrol.php" class="link">Fehlerkontrolle</a>
      </td>
     </tr>

     <tr>
      <td>left</td>
      <td><code class="literal">instanceof</code></td>
      <td>
       <a href="language.operators.type.php" class="link">Typ</a>
      </td>
     </tr>

     <tr>
      <td>(n. z.)</td>
      <td><code class="literal">!</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">logisch</a>
      </td>
     </tr>

     <tr>
      <td>links</td>
      <td>
       <code class="literal">*</code>
       <code class="literal">/</code>
       <code class="literal">%</code>
      </td>
      <td>
       <a href="language.operators.arithmetic.php" class="link">arithmetisch</a>
      </td>
     </tr>

     <tr>
      <td>links</td>
      <td>
       <code class="literal">+</code>
       <code class="literal">-</code>
       <code class="literal">.</code>
      </td>
      <td>
       <a href="language.operators.arithmetic.php" class="link">arithmetisch</a>
       (binär <code class="literal">+</code> und <code class="literal">-</code>),
       <a href="language.operators.array.php" class="link">Array</a> und
       <a href="language.operators.string.php" class="link">Zeichenkette</a>
       (<code class="literal">.</code> vor PHP 8.0.0)
      </td>
     </tr>

     <tr>
      <td>links</td>
      <td>
       <code class="literal">&lt;&lt;</code>
       <code class="literal">&gt;&gt;</code>
      </td>
      <td>
       <a href="language.operators.bitwise.php" class="link">bitweise</a>
      </td>
     </tr>

     <tr>
      <td>left</td>
      <td><code class="literal">.</code></td>
      <td>
       <a href="language.operators.string.php" class="link">Zeichenkette</a>
       (seit PHP 8.0.0)
      </td>
     </tr>

     <tr>
      <td>non-associative</td>
      <td>
       <code class="literal">&lt;</code>
       <code class="literal">&lt;=</code>
       <code class="literal">&gt;</code>
       <code class="literal">&gt;=</code>
      </td>
      <td>
       <a href="language.operators.comparison.php" class="link">Vergleiche</a>
      </td>
     </tr>

     <tr>
      <td>nicht-assoziativ</td>
      <td>
       <code class="literal">==</code>
       <code class="literal">!=</code>
       <code class="literal">===</code>
       <code class="literal">!==</code>
       <code class="literal">&lt;&gt;</code>
       <code class="literal">&lt;=&gt;</code>
      </td>
      <td>
       <a href="language.operators.comparison.php" class="link">Vergleiche</a>
      </td>
     </tr>

     <tr>
      <td>links</td>
      <td><code class="literal">&amp;</code></td>
      <td>
       <a href="language.operators.bitwise.php" class="link">bitweise</a> und
       <a href="language.references.php" class="link">Referenzen</a>
      </td>
     </tr>

     <tr>
      <td>links</td>
      <td><code class="literal">^</code></td>
      <td>
       <a href="language.operators.bitwise.php" class="link">bitweise</a>
      </td>
     </tr>

     <tr>
      <td>links</td>
      <td><code class="literal">|</code></td>
      <td>
       <a href="language.operators.bitwise.php" class="link">bitweise</a>
      </td>
     </tr>

     <tr>
      <td>links</td>
      <td><code class="literal">&amp;&amp;</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">logisch</a>
      </td>
     </tr>

     <tr>
      <td>links</td>
      <td><code class="literal">||</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">logisch</a>
      </td>
     </tr>

     <tr>
      <td>rechts</td>
      <td><code class="literal">??</code></td>
      <td>
       <a href="language.operators.comparison.php#language.operators.comparison.coalesce" class="link">NULL-Zusammenfügungsoperator</a>
      </td>
     </tr>

     <tr>
      <td>nicht-assoziativ</td>
      <td><code class="literal">? :</code></td>
      <td>
       <a href="language.operators.comparison.php#language.operators.comparison.ternary" class="link">ternärer Operator</a>
       (vor PHP 8.0.0 links-assoziativ)
      </td>
     </tr>

     <tr>
      <td>rechts</td>
      <td>
       <code class="literal">=</code>
       <code class="literal">+=</code>
       <code class="literal">-=</code>
       <code class="literal">*=</code>
       <code class="literal">**=</code>
       <code class="literal">/=</code>
       <code class="literal">.=</code>
       <code class="literal">%=</code>
       <code class="literal">&amp;=</code>
       <code class="literal">|=</code>
       <code class="literal">^=</code>
       <code class="literal">&lt;&lt;=</code>
       <code class="literal">&gt;&gt;=</code>
       <code class="literal">??=</code>
      </td>
      <td>
       <a href="language.operators.assignment.php" class="link">Zuweisung</a>
      </td>
     </tr>

     <tr>
      <td>(n. z.)</td>
      <td><code class="literal">yield from</code></td>
      <td>
       <a href="language.generators.syntax.php#control-structures.yield.from" class="link">yield from</a>
      </td>
     </tr>

     <tr>
      <td>(n. z.)</td>
      <td><code class="literal">yield</code></td>
      <td>
       <a href="language.generators.syntax.php#control-structures.yield" class="link">yield</a>
      </td>
     </tr>

     <tr>
      <td>(n. z.)</td>
      <td><code class="literal">print</code></td>
      <td><span class="function"><a href="function.print.php" class="function">print</a></span></td>
     </tr>

     <tr>
      <td>links</td>
      <td><code class="literal">and</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">logisch</a>
      </td>
     </tr>

     <tr>
      <td>links</td>
      <td><code class="literal">xor</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">logisch</a>
      </td>
     </tr>

     <tr>
      <td>links</td>
      <td><code class="literal">or</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">logisch</a>
      </td>
     </tr>

    </tbody>
   
  </table>

 </p>
 <p class="para">
  <div class="example" id="example-1">
   <p><strong>Beispiel #1 Assoziativität</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">3 </span><span style="color: #007700">* </span><span style="color: #0000BB">3 </span><span style="color: #007700">% </span><span style="color: #0000BB">5</span><span style="color: #007700">; </span><span style="color: #FF8000">// (3 * 3) % 5 = 4<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">$b </span><span style="color: #007700">+= </span><span style="color: #0000BB">3</span><span style="color: #007700">; </span><span style="color: #FF8000">// $a = ($b += 3) -&gt; $a = 5, $b = 5<br /></span><span style="color: #0000BB">var_dump</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 /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  Der ternäre Operator erfordert explizit die Verwendung von Klammern, um
  den Rangfolge zu verdeutlichen.
 </p>
 <p class="para">
  <div class="example" id="example-2">
   <p><strong>Beispiel #2 Explizite Rangfolge</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">true </span><span style="color: #007700">? </span><span style="color: #0000BB">0 </span><span style="color: #007700">: (</span><span style="color: #0000BB">true </span><span style="color: #007700">? </span><span style="color: #0000BB">1 </span><span style="color: #007700">: </span><span style="color: #0000BB">2</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Dies ist seit PHP 8 nicht mehr erlaubt<br />// $a = true ? 0 : true ? 1 : 2;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  Operator-Rangfolge und -Assoziativität bestimmen nur wie Ausdrücke gruppiert
  werden, aber nicht die Auswertungsreihenfolge. PHP legt (im Allgemeinen)
  nicht fest, in welcher Reihenfolge ein Ausdruck ausgewertet wird. Code, der
  eine bestimmte Auswertungsreihenfolge erwartet, sollte vermieden werden,
  denn das Verhalten kann sich von Version zu Version ändern und auch vom
  umgebenden Code abhängen.
  <div class="example" id="example-3">
   <p><strong>Beispiel #3 Nicht definierte Auswertungsreihenfolge</strong></p>
   <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$a</span><span style="color: #007700">++; </span><span style="color: #FF8000">// gibt entweder 2 oder 3 aus<br /><br /></span><span style="color: #0000BB">$i </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">] = </span><span style="color: #0000BB">$i</span><span style="color: #007700">++; </span><span style="color: #FF8000">// der Index ist entweder 1 oder 2<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-4">
   <p><strong>Beispiel #4 Die Rangfolge von <code class="literal">+</code>, <code class="literal">-</code> und <code class="literal">.</code></strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$x </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// diese Zeile könnte eine unerwartete Ausgabe produzieren:<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x minus 1 ist gleich " </span><span style="color: #007700">. </span><span style="color: #0000BB">$x</span><span style="color: #007700">-</span><span style="color: #0000BB">1 </span><span style="color: #007700">. </span><span style="color: #DD0000">", hoffe ich jedenfalls\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// die gewünschte Rangfolge kann durch die Verwendung von Klammern erzwungen werden:<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x minus 1 ist gleich " </span><span style="color: #007700">. (</span><span style="color: #0000BB">$x</span><span style="color: #007700">-</span><span style="color: #0000BB">1</span><span style="color: #007700">) . </span><span style="color: #DD0000">", hoffe ich jedenfalls\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Dies ist nicht erlaubt und führt zu einem TypeError:<br /></span><span style="color: #007700">echo ((</span><span style="color: #DD0000">"x minus 1 ist gleich " </span><span style="color: #007700">. </span><span style="color: #0000BB">$x</span><span style="color: #007700">) - </span><span style="color: #0000BB">1</span><span style="color: #007700">) . </span><span style="color: #DD0000">", hoffe ich jedenfalls\n"</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, hoffe ich jedenfalls
-1, hoffe ich jedenfalls
Fatal error: Uncaught TypeError: Unsupported operand types: string - int
</pre></div>
   </div>
  </div>
  <div class="example" id="example-5">
   <p><strong>Beispiel #5 Vor PHP 8 hatten <code class="literal">+</code>, <code class="literal">-</code> und <code class="literal">.</code> dieselbe Rangfolge</strong></p>
   <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$x </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// diese Zeile könnte eine unerwartete Ausgabe produzieren:<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x minus 1 ist gleich " </span><span style="color: #007700">. </span><span style="color: #0000BB">$x</span><span style="color: #007700">-</span><span style="color: #0000BB">1 </span><span style="color: #007700">. </span><span style="color: #DD0000">", hoffe ich jedenfalls\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// da es wie diese Zeile ausgewertet wird (vor PHP 8.0.0):<br /></span><span style="color: #007700">echo ((</span><span style="color: #DD0000">"x minus 1 ist gleich " </span><span style="color: #007700">. </span><span style="color: #0000BB">$x</span><span style="color: #007700">) - </span><span style="color: #0000BB">1</span><span style="color: #007700">) . </span><span style="color: #DD0000">", hoffe ich jedenfalls\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// die gewünschte Rangfolge kann durch die Verwendung von Klammern erzwungen werden:<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x minus 1 ist gleich " </span><span style="color: #007700">. (</span><span style="color: #0000BB">$x</span><span style="color: #007700">-</span><span style="color: #0000BB">1</span><span style="color: #007700">) . </span><span style="color: #DD0000">", hoffe ich jedenfalls\n"</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, hoffe ich jedenfalls
-1, hoffe ich jedenfalls
x minus 1 ist gleich 3, hoffe ich jedenfalls
</pre></div>
   </div>
  </div>
 </p>
 <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
  <p class="para">
   Obwohl <code class="literal">=</code> einen niedrigeren Rang als die meisten anderen
   Operatoren hat, erlaubt PHP dennoch Ausdrücke wie den folgenden:
   <code class="literal">if (!$a = foo())</code>; in diesem Fall wird der Rückgabewert
   von <code class="literal">foo()</code> der Variablen <var class="varname">$a</var>
   zugewiesen.
  </p>
 </p></blockquote>
 <div class="sect2">
  <h3 class="title">Changelog</h3>
  <table class="doctable informaltable">
   
    <thead>
     <tr>
      <th>Version</th>
      <th>Beschreibung</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>8.0.0</td>
      <td>
       Die Verkettung von Zeichenketten (<code class="literal">.</code>) hat jetzt eine
       niedrigere Rangfolge als die arithmetische Addition/Subtraktion
       (<code class="literal">+</code> und <code class="literal">-</code>) und bitweises
       Verschieben nach links/rechts (<code class="literal">&lt;&lt;</code> und
       <code class="literal">&gt;&gt;</code>); vorher hatte sie die gleiche Rangfolge
       wie <code class="literal">+</code> und <code class="literal">-</code> und eine höhere
       Rangfolge als <code class="literal">&lt;&lt;</code> und
       <code class="literal">&gt;&gt;</code>.
      </td>
     </tr>

     <tr>
      <td>8.0.0</td>
      <td>
       Der ternäre Operator (<code class="literal">? :</code>) ist jetzt
       nicht-assoziativ; vorher war er links-assoziativ.
      </td>
     </tr>

     <tr>
      <td>7.4.0</td>
      <td>
       Der Vorrang der String-Verkettung (<code class="literal">.</code>) gegenüber der
       arithmetischen Addition/Subtraktion (<code class="literal">+</code> oder
       <code class="literal">-</code>) oder bitweises Verschieben nach links/rechts
       (<code class="literal">&lt;&lt;</code> oder <code class="literal">&gt;&gt;</code>), d. h.
       die gemeinsame Verwendung in einem Ausdruck ohne Klammern, ist
       veraltet.
      </td>
     </tr>

     <tr>
      <td>7.4.0</td>
      <td>
       Die Links-Assoziativität des ternären Operators (<code class="literal">?
       :</code>), d. h. die Verschachtelung mehrerer ternärer Operatoren,
       die nicht-in Klammern eingeschlossen sind, ist veraltet.
      </td>
     </tr>

    </tbody>
   
  </table>

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