<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'language.operators.precedence.php',
    1 => 'Priorit&eacute; des op&eacute;rateurs',
    2 => 'La priorit&eacute; des op&eacute;rateurs',
  ),
  'up' => 
  array (
    0 => 'language.operators.php',
    1 => 'Les op&eacute;rateurs',
  ),
  'prev' => 
  array (
    0 => 'language.operators.php',
    1 => 'Les op&eacute;rateurs',
  ),
  'next' => 
  array (
    0 => 'language.operators.arithmetic.php',
    1 => 'Arithm&eacute;tique',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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">La priorité des opérateurs</h2>
 
 <p class="para">
  La priorité des opérateurs spécifie
  l&#039;ordre dans lequel les valeurs doivent être analysées.
  Par exemple, dans l&#039;expression <code class="literal">1 + 5 * 3</code>, le résultat est
  <code class="literal">16</code> et non <code class="literal">18</code>, car la multiplication
  (&quot;*&quot;) a une priorité supérieure par rapport à l&#039;addition (&quot;+&quot;).
  Des parenthèses peuvent être utilisées pour forcer la priorité, si
  nécessaire. Par exemple : <code class="literal">(1 + 5) * 3</code> donnera
  <code class="literal">18</code>.
 </p>
 <p class="para">
  Lorsque les opérateurs ont une priorité égale, leur association
  décide la façon dont les opérateurs sont groupés. Par exemple,
  &quot;-&quot; est une association par la gauche, ainsi <code class="literal">1 - 2 - 3</code>
  est groupé comme ceci <code class="literal">(1 - 2) - 3</code> et sera évalué
  à <code class="literal">-4</code>. D&#039;un autre côté, &quot;=&quot; est une association par la
  droite, ainsi, <code class="literal">$a = $b = $c</code> est groupé comme ceci
  <code class="literal">$a = ($b = $c)</code>.
 </p>

 <p class="para">
  Les opérateurs, dont la priorité est égale, qui ne sont pas associatifs,
  ne peuvent pas être utilisés entre eux, par exemple,
  <code class="literal">1 &lt; 2 &gt; 1</code> est interdit en PHP. L&#039;expression
  <code class="literal">1 &lt;= 1 == 1</code> par contre, est autorisée, car l&#039;opérateur
  <code class="literal">==</code> a une priorité inférieure à l&#039;opérateur
  <code class="literal">&lt;=</code>.
 </p>
 <p class="para">
  L&#039;associativité a uniquement du sens pour les opérateurs binaires (et ternaires).
  Les opérateurs unitaires sont soit préfixés, soit suffixés ainsi cette notion
  n&#039;est pas applicable. Par exemple <code class="literal">!!$a</code> peut uniquement
  être groupé de la manière suivante <code class="literal">!(!$a)</code>.
 </p>
 <p class="para">
  L&#039;utilisation des parenthèses, y compris lorsqu&#039;elles ne sont pas nécessaires,
  permet de mieux lire le code en effectuant des groupements explicites
  plutôt qu&#039;imaginer la priorité des opérateurs et leurs associations.
 </p>
 <p class="para">
  Le tableau qui suit liste les opérateurs par ordre de priorité, avec la
  priorité la plus élevée en haut. Les opérateurs sur la même ligne ont
  une priorité équivalente (donc l&#039;associativité décide du groupement).
  <table class="doctable table">
   <caption><strong>Priorité des opérateurs</strong></caption>
   
    <thead>
     <tr>
      <th>Associativité</th>
      <th>Opérateurs</th>
      <th>Information additionnelle</th>
     </tr>

    </thead>

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

     <tr>
      <td>droite</td>
      <td><code class="literal">**</code></td>
      <td><a href="language.operators.arithmetic.php" class="link">arithmétique</a></td>
     </tr>

     <tr>
      <td>(n/a)</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">arithmétique</a> (unitaire <code class="literal">+</code> et <code class="literal">-</code>),
       <a href="language.operators.increment.php" class="link">incrément/décrément</a>,
       <a href="language.operators.bitwise.php" class="link">bit à bit</a>,
       <a href="language.types.type-juggling.php#language.types.typecasting" class="link">casting de type</a> et
       <a href="language.operators.errorcontrol.php" class="link">contrôle d&#039;erreur</a>
      </td>
     </tr>

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

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

     <tr>
      <td>gauche</td>
      <td>
       <code class="literal">*</code>
       <code class="literal">/</code>
       <code class="literal">%</code>
      </td>
      <td>
       <a href="language.operators.arithmetic.php" class="link">arithmétique</a>
      </td>
     </tr>

     <tr>
      <td>gauche</td>
      <td>
       <code class="literal">+</code>
       <code class="literal">-</code>
       <code class="literal">.</code>
      </td>
      <td>
       <a href="language.operators.arithmetic.php" class="link">arithmétique</a>
       (binaire <code class="literal">+</code> et <code class="literal">-</code>),
       <a href="language.operators.array.php" class="link">tableau</a> et
       <a href="language.operators.string.php" class="link">chaîne de caractères</a>
       (<code class="literal">.</code> antérieur à PHP 8.0.0)
      </td>
     </tr>

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

     <tr>
      <td>gauche</td>
      <td><code class="literal">.</code></td>
      <td>
       <a href="language.operators.string.php" class="link">chaîne de caractères</a> (à partir de PHP 8.0.0)
      </td>
     </tr>

     <tr>
      <td>gauche</td>
      <td><code class="literal">|&gt;</code></td>
      <td>
       <a href="language.operators.functional.php" class="link">pipe</a>
      </td>
     </tr>

     <tr>
      <td>non-associatif</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">comparaison</a>
      </td>
     </tr>

     <tr>
      <td>non-associatif</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">comparaison</a>
      </td>
     </tr>

     <tr>
      <td>gauche</td>
      <td><code class="literal">&amp;</code></td>
      <td>
       <a href="language.operators.bitwise.php" class="link">bit à bit</a> et
       <a href="language.references.php" class="link">références</a></td>
     </tr>

     <tr>
      <td>gauche</td>
      <td><code class="literal">^</code></td>
      <td>
       <a href="language.operators.bitwise.php" class="link">bit à bit</a>
      </td>
     </tr>

     <tr>
      <td>gauche</td>
      <td><code class="literal">|</code></td>
      <td>
       <a href="language.operators.bitwise.php" class="link">bit à bit</a>
      </td>
     </tr>

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

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

     <tr>
      <td>droite</td>
      <td><code class="literal">??</code></td>
      <td>
       <a href="language.operators.comparison.php#language.operators.comparison.coalesce" class="link">coalescence nulle</a>
      </td>
     </tr>

     <tr>
      <td>non-associatif</td>
      <td><code class="literal">? :</code></td>
      <td>
       <a href="language.operators.comparison.php#language.operators.comparison.ternary" class="link">ternaire</a>
       (gauche-associatif antérieur à PHP 8.0.0)
      </td>
     </tr>

     <tr>
      <td>droite</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">affectation</a>
      </td>
     </tr>

     <tr>
      <td>(n/a)</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/a)</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/a)</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>gauche</td>
      <td><code class="literal">and</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">logique</a>
      </td>
     </tr>

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

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

     <tr>
      <td>(n/a)</td>
      <td><code class="literal">throw</code></td>
      <td>
       <a href="language.exceptions.php" class="link">throw</a>
      </td>
     </tr>

    </tbody>
   
  </table>

 </p>
 <p class="para">
  <div class="example" id="example-1">
   <p><strong>Exemple #1 Associativité</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">
  L&#039;opérateur ternaire requiert spécifiquement l&#039;utilisation de parenthèses
  pour lever l&#039;ambiguïté de la priorité.
 </p>
 <p class="para">
  <div class="example" id="example-2">
   <p><strong>Exemple #2 Priorité explicite</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">// Ceci n'est plus permis à partir de PHP 8<br />// $a = true ? 0 : true ? 1 : 2;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  La priorité et l&#039;association de l&#039;opérateur ne déterminent que
  la façon dont les expressions sont groupées ; ils ne spécifient
  pas l&#039;ordre de l&#039;évaluation. PHP ne spécifie pas (de manière générale)
  l&#039;ordre dans lequel une expression est évaluée et le code qui suppose
  un ordre spécifique d&#039;évaluation ne devrait pas exister, car le
  comportement peut changer entre les différentes versions de PHP
  ou suivant le code environnant.
  <div class="example" id="example-3">
   <p><strong>Exemple #3 Ordre d&#039;évaluation indéfini</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">// peut afficher 2 ou 3<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">// peut définir l'index 1 ou 2<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-4">
   <p><strong>Exemple #4 Priorité de <code class="literal">+</code>, <code class="literal">-</code> et <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 /><br /></span><span style="color: #FF8000">// Cette ligne peut entraîner une sortie inattendue :<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x moins un est égal à" </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">", en tout cas j'espère\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// la priorité désirée peut être renforcée en utilisant les parenthèses :<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x moins un est égal à" </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">", en tout cas j'espère\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Ceci n'est pas permis, et lève une TypeError :<br /></span><span style="color: #007700">echo ((</span><span style="color: #DD0000">"x moins un est égal à" </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">", en tout cas j'espère\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

   <div class="example-contents"><p>L&#039;exemple ci-dessus va afficher :</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
-1, en tout cas j&#039;espère
-1, en tout cas j&#039;espère
Fatal error: Uncaught TypeError: Unsupported operand types: string - int
</pre></div>
   </div>
  </div>
  <div class="example" id="example-5">
   <p><strong>Exemple #5 Avant PHP 8, <code class="literal">+</code>, <code class="literal">-</code> et <code class="literal">.</code> avaient la même priorité</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">// Cette ligne peut entraîner une sortie inattendue :<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x moins un est égal à" </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">", en tout cas j'espère\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// parce que c'est évalué comme la ligne suivante (antérieur à PHP 8.0.0) :<br /></span><span style="color: #007700">echo ((</span><span style="color: #DD0000">"x moins un est égal à" </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">", en tout cas j'espère\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// la priorité désirée peut être renforcée en utilisant les parenthèses :<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x moins un est égal à" </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">", en tout cas j'espère\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>L&#039;exemple ci-dessus va afficher :</p></div>
   <div class="example-contents screen">
    <div class="annotation-interactive cdata"><pre>
-1, en tout cas j&#039;espère
-1, en tout cas j&#039;espère
x moins un est égal à 3, en tout cas j&#039;espère
</pre></div>
   </div>
  </div>
 </p>
 <blockquote class="note"><p><strong class="note">Note</strong>: 
  <p class="para">
   Bien que <code class="literal">=</code> soit prioritaire sur
   la plupart des opérateurs, PHP va tout de même exécuter des
   expressions comme : <code class="literal">if (!$a = foo())</code>.
   Dans cette situation, le résultat de <code class="literal">foo()</code>
   sera placé dans la variable <var class="varname">$a</var>.
  </p>
 </p></blockquote>
 <div class="sect2">
  <h3 class="title">Historique</h3>
  <table class="doctable informaltable">
   
    <thead>
     <tr>
      <th>Version</th>
      <th>Description</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>8.0.0</td>
      <td>
       La concaténation de chaînes de caractères (<code class="literal">.</code>) a désormais
       une priorité moins élevée que l&#039;addition/soustraction arithmétique
       (<code class="literal">+</code> et <code class="literal">-</code>) et les shifts bit-à-bit
       gauche/droite (<code class="literal">&lt;&lt;</code> et <code class="literal">&gt;&gt;</code>);
       auparavant ceci avait la même priorité que <code class="literal">+</code> et <code class="literal">-</code>,
       et une priorité plus élevée que <code class="literal">&lt;&lt;</code> et <code class="literal">&gt;&gt;</code>.
      </td>
     </tr>

     <tr>
      <td>8.0.0</td>
      <td>
       L&#039;opérateur ternaire (<code class="literal">? :</code>) est désormais non associatif ;
       auparavant, il était gauche-associatif.
      </td>
     </tr>

     <tr>
      <td>7.4.0</td>
      <td>
       Dépendre de la priorité de la concaténation de chaînes de caractères
       (<code class="literal">.</code>) relatif à l&#039;addition/soustraction arithmétique
       (<code class="literal">+</code> ou <code class="literal">-</code>) ou les shifts bit-à-bit
       gauche/droite (<code class="literal">&lt;&lt;</code> ou <code class="literal">&gt;&gt;</code>),
       c.-à-d. les utiliser ensemble dans une expression sans parenthèse, est obsolète.
      </td>
     </tr>

     <tr>
      <td>7.4.0</td>
      <td>
       Dépendre de la gauche-associativité de l&#039;opérateur ternaire (<code class="literal">? :</code>),
       c.-à-d. l&#039;imbrication de plusieurs opérateurs ternaires qui ne sont pas
       entre parenthèses, est obsolète.
      </td>
     </tr>

    </tbody>
   
  </table>

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