<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/langref.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'language.expressions.php',
    1 => 'Les expressions',
    2 => 'Les expressions',
  ),
  'up' => 
  array (
    0 => 'langref.php',
    1 => 'R&eacute;f&eacute;rence du langage',
  ),
  'prev' => 
  array (
    0 => 'language.constants.magic.php',
    1 => 'Constantes magiques',
  ),
  'next' => 
  array (
    0 => 'language.operators.php',
    1 => 'Les op&eacute;rateurs',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'language/expressions.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.expressions" class="chapter">
 <h1 class="title">Les expressions</h1>

 <p class="simpara">
  Les expressions sont les pièces de construction les plus importantes de PHP.
  En PHP, presque tout ce qui s&#039;écrit est une expression. La manière la
  plus simple de définir une expression est : &quot;tout ce qui a une valeur&quot;.
 </p>
 <p class="simpara">
  Les formes les plus simples d&#039;expressions sont les constantes et les variables.
  Lorsque l&#039;on écrit <code class="code">$a = 5</code>, on assigne la valeur <code class="code">5</code>
  à la variable <var class="varname">$a</var>. Bien évidemment, <code class="code">5</code> vaut 5 ou,
  en d&#039;autres termes, <code class="code">5</code> est une expression avec pour valeur 5
  (dans ce cas, <code class="code">5</code> est un entier constant).
 </p>
 <p class="simpara">
  Après cette assignation, on peut considérer que <var class="varname">$a</var>
  a pour valeur 5 et donc, écrire <code class="code">$b = $a</code>, revient à écrire
  <code class="code">$b = 5</code>. En d&#039;autres termes, <var class="varname">$a</var> est une
  expression avec une valeur de 5. Si tout fonctionne correctement,
  c&#039;est exactement ce qui arrive.
 </p>
 <p class="para">
  Un exemple plus complexe concerne les fonctions. Par exemple, 
  considérons la fonction suivante :
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo </span><span style="color: #007700">()<br />{<br />    return </span><span style="color: #0000BB">5</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="simpara">
  En supposant une familiarité avec le concept de fonction,
  (si ce n&#039;est pas le cas, consulter le chapitre concernant les
  <a href="language.functions.php" class="link">fonctions</a>),
  on conviendra que <code class="code">$c = foo()</code> est équivalent
  à <code class="code">$c = 5</code>, et
  c&#039;est tout à fait exact. Les fonctions sont des expressions qui
  ont la valeur de leur &quot;valeur de retour&quot;. Si <code class="code">foo()</code>
  renvoie 5, la valeur de l&#039;expression <code class="code">foo()</code> est 5.
  Habituellement, les fonctions ne font pas que
  renvoyer une valeur constante, mais réalisent des traitements.
 </p>
 <p class="simpara">
  Bien sûr, les valeurs en PHP n&#039;ont pas à être des
  valeurs numériques, comme c&#039;est souvent le cas. PHP supporte quatre
  types de variables scalaires : les valeurs entières (<a href="language.types.integer.php" class="link">entier</a>), les nombres
  à virgule flottante (<span class="type"><a href="language.types.float.php" class="type float">float</a></span>), les chaînes de caractères
  (<a href="language.types.string.php" class="link">chaîne de caractères</a>) et les booléens (<span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>).
  (une variable scalaire est une variable qui ne peut pas être scindée en
  morceaux, au contraire des tableaux par exemple). PHP supporte aussi deux
  types composés : les tableaux et les objets. Chacun de ces types
  de variables peut être affecté ou renvoyé par une
  fonction.
 </p>
 <p class="simpara">
  PHP va plus loin dans la gestion des expressions, comme le font d&#039;autres
  langages. PHP est un langage orienté expression, dans le sens où
  presque tout est une expression. Considérons l&#039;exemple dont nous avons
  déjà parlé, <code class="code">$a = 5</code>. Il est facile de voir qu&#039;il y a
  deux valeurs qui entrent en jeu ici, la valeur de la constante entière <code class="code">5</code>
  et la valeur de la variable <var class="varname">$a</var> qui est mise à jour à la
  valeur 5. Mais, la vérité est qu&#039;il y a une autre valeur qui entre en jeu
  ici et c&#039;est la valeur de l&#039;assignation elle-même. L&#039;assignation elle-même
  est assignée à une valeur, dans ce cas-là 5. En pratique,
  cela signifie que <code class="code">$a = 5</code> est une expression qui a pour
  valeur 5. Donc, écrire <code class="code">$b = ($a = 5)</code>
  revient à écrire <code class="code">$a = 5; $b = 5;</code>
  (un point-virgule marque la fin d&#039;une instruction). Comme les assignations
  sont analysées de droite à gauche, il est aussi possible d&#039;écrire
  <code class="code">$b = $a = 5</code>.
 </p>
 <p class="simpara">
  Un autre bon exemple du langage orienté expression est la
  pre-incrémentation et la post-incrémentation, (ainsi que
  la décrémentation). Les utilisateurs de PHP
  et ceux de nombreux autres langages sont habitués à
  la notation <code class="code">variable++</code> et
  <code class="code">variable--</code>.
  Ce sont les <a href="language.operators.increment.php" class="link">opérateurs
  d&#039;incrémentation et de décrémentation</a>. PHP
  ajoute les possibilités d&#039;incrémentation et de décrémentation
  comme c&#039;est le cas dans le langage C. En PHP, comme en C, il y a deux
  types d&#039;opérateurs d&#039;incrémentation (pre-incrémentation et
  post-incrémentation). Les deux types d&#039;opérateur
  d&#039;incrémentation jouent le même rôle (c&#039;est-à-dire qu&#039;ils
  incrémentent la variable). La différence vient de la valeur de
  l&#039;opérateur d&#039;incrémentation. L&#039;opérateur de
  pre-incrémentation, qui s&#039;écrit <code class="code">++$variable</code>, évalue
  la valeur incrémentée (PHP incrémente la variable
  avant de lire la valeur de cette variable, d&#039;où le nom de
  pre-incrémentation). L&#039;opérateur de post-incrémentation,
  qui s&#039;écrit <code class="code">$variable++</code> , évalue la valeur de la
  variable <var class="varname">$variable</var> avant de l&#039;incrémenter (PHP incrémente la variable après
  avoir lu sa valeur, d&#039;où le nom de post-incrémentation).
 </p>
 <p class="simpara">
  Un type d&#039;expression très commun est <a href="language.operators.comparison.php" class="link">l&#039;expression de comparaison</a>. Ces
  expressions sont évaluées à <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> ou <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>,
  respectivement. PHP supporte les opérateurs de comparaison &gt; (plus
  grand que), &gt;= (plus grand ou égal), == (égal à),
  != (différent de), &lt; (plus petit que) et &lt;= (plus petit ou égal).
  Le langage supporte également un ensemble d&#039;opérateurs d&#039;équivalence stricte : ===
  (égal à et du même type) et !== (différent de ou pas du même type).
  Ces expressions sont
  utilisées de manière courante dans les instructions conditionnelles, comme
  l&#039;instruction <code class="code">if</code>.
 </p>
 <p class="simpara">
  Pour le dernier exemple d&#039;expression, nous allons parler des combinaisons
  d&#039;opérateurs/assignation. Pour incrémenter la
  variable <var class="varname">$a</var> d&#039;une unité, il suffit d&#039;écrire
  <code class="code">$a++</code> ou <code class="code">++$a</code>.
  Mais pour ajouter la valeur 3 à la
  variable ? Il est possible d&#039;écrire plusieurs fois <code class="code">$a++</code>, mais
  ce n&#039;est pas la meilleure des méthodes. Une pratique plus courante est
  d&#039;écrire <code class="code">$a = $a + 3</code>. L&#039;expression <code class="code">$a + 3</code>
  correspond à la valeur <var class="varname">$a</var> plus 3,
  et est de nouveau assignée à la variable <var class="varname">$a</var>.
  Donc, le résultat est l&#039;incrémentation de 3 unités de la variable <var class="varname">$a</var>.
  En PHP, comme dans de nombreux autres langages comme le C, il est possible d&#039;écrire cela de manière plus
  concise, manière qui avec le temps se révélera plus claire et plus rapide
  à comprendre. Ajouter 3 à la valeur de la variable <var class="varname">$a</var>
  peut s&#039;écrire <code class="code">$a += 3</code>. Cela signifie précisément : &quot;on
  prend la valeur de la variable <var class="varname">$a</var>, on ajoute la valeur 3
  et on assigne cette valeur à la variable <var class="varname">$a</var>&quot;. Et pour
  être plus concis et plus clair, cette expression est plus rapide. La valeur
  de l&#039;expression <code class="code">$a += 3</code>, comme l&#039;assignation d&#039;une
  valeur quelconque, est la valeur assignée. Il est à noter que ce n&#039;est pas 3,
  mais la combinaison de la valeur de la variable <var class="varname">$a</var> plus
  la valeur 3. (c&#039;est la valeur qui est assignée à la variable
  <var class="varname">$a</var>). N&#039;importe quel opérateur binaire
  peut utiliser ce type d&#039;assignation, par exemple <code class="code">$a -= 5</code>
  (soustraction de 5 de la valeur de la variable <var class="varname">$a</var>),
  <code class="code">$b *= 7</code> (multiplication de la valeur de la variable
  <var class="varname">$b</var> par 7).
 </p>
 <p class="para">
  Il y a une autre expression qui peut paraître complexe si elle n&#039;a pas été
  vue dans d&#039;autres langages, l&#039;opérateur conditionnel ternaire :
 </p>
 <p class="para">
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$first </span><span style="color: #007700">? </span><span style="color: #0000BB">$second </span><span style="color: #007700">: </span><span style="color: #0000BB">$third<br />?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  Si la valeur de la première sous-expression est vraie (<strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>)
  (différente de 0), alors la deuxième sous-expression est
  évaluée et constitue le résultat de l&#039;expression
  conditionnelle. Sinon, c&#039;est la troisième sous-expression qui est
  évaluée et qui constitue le résultat de l&#039;expression.
 </p>
 <p class="para">
  Les exemples suivants devraient permettre de mieux comprendre
  la pre-incrémentation, la post-incrémentation
  et le concept des expressions en général :
 </p>
 <p class="para">
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">double</span><span style="color: #007700">(</span><span style="color: #0000BB">$i</span><span style="color: #007700">)<br />{<br />    return </span><span style="color: #0000BB">$i</span><span style="color: #007700">*</span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">;        </span><span style="color: #FF8000">/* Assigne la valeur 5 aux variables $a et $b  */<br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">$a</span><span style="color: #007700">++;          </span><span style="color: #FF8000">/* Post-incrémentation de la variable $a et assignation de<br />                       la valeur à la variable $c */<br /></span><span style="color: #0000BB">$e </span><span style="color: #007700">= </span><span style="color: #0000BB">$d </span><span style="color: #007700">= ++</span><span style="color: #0000BB">$b</span><span style="color: #007700">;     </span><span style="color: #FF8000">/* Pre-incrémentation, et assignation de la valeur aux<br />                       variables $d et $e  */<br />/* à ce niveau, les variables $d et $e sont égales à 6 */<br /></span><span style="color: #0000BB">$f </span><span style="color: #007700">= </span><span style="color: #0000BB">double</span><span style="color: #007700">(</span><span style="color: #0000BB">$d</span><span style="color: #007700">++);  </span><span style="color: #FF8000">/* assignation du double de la valeur de $d à la variable $f ($f vaut 12),<br />                       puis incrémentation de la valeur de $d  */<br /></span><span style="color: #0000BB">$g </span><span style="color: #007700">= </span><span style="color: #0000BB">double</span><span style="color: #007700">(++</span><span style="color: #0000BB">$e</span><span style="color: #007700">);  </span><span style="color: #FF8000">/* assigne deux fois la valeur de $e après<br />                       incrémentation, 2*7 = 14 à $g */<br /></span><span style="color: #0000BB">$h </span><span style="color: #007700">= </span><span style="color: #0000BB">$g </span><span style="color: #007700">+= </span><span style="color: #0000BB">10</span><span style="color: #007700">;      </span><span style="color: #FF8000">/* Tout d'abord, $g est incrémentée de 10, et donc $g vaut 24.<br />                       Ensuite, la valeur de $g, (24) est assignée à la variable $h,<br />                       qui vaut donc elle aussi 24. */<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="simpara">
  Au début de ce chapitre, nous avons dit que nous allions décrire les
  différents types d&#039;instructions, et donc, comme promis, nous allons voir que
  les expressions peuvent être des instructions. Mais attention, toutes les
  expressions ne sont pas des instructions. Dans ce cas-là, une instruction
  est de la forme &#039;<code class="code">expr ;</code>&#039;, c&#039;est-à-dire, une expression
  suivie par un point-virgule.
  Dans <code class="code">$b = $a = 5;</code>, <code class="code">$a = 5</code> est une expression valide,
  mais ce n&#039;est pas une instruction en elle-même.
  <code class="code">$b = $a = 5;</code> est une instruction valide.
 </p>
 <p class="simpara">
  La dernière chose qui mérite d&#039;être mentionnée est
  la véritable valeur des expressions. Lors de tests
  sur une variable, dans une boucle conditionnelle par exemple, il n&#039;est pas
  nécessaire de savoir quelle est la valeur exacte de l&#039;expression.
  Seul importe de savoir si le résultat signifie <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> ou <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
  
  Les constantes <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> et <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> (insensible à la casse) sont les deux
  valeurs possibles pour un booléen. Lorsque nécessaire, une expression
  est automatiquement convertie en booléen. Consulter la
  <a href="language.types.type-juggling.php#language.types.typecasting" class="link">section sur le transtypage</a>
  pour plus de détails.
 </p>
 <p class="simpara">
  PHP propose une implémentation complète et détaillée des expressions, et
  la documenter entièrement va au-delà de la portée de ce manuel.
  Les exemples ci-dessus devraient donner une
  bonne idée de ce qu&#039;est une expression et comment construire des
  expressions utiles. Dans tout le reste de ce manuel, nous écrirons
  <var class="varname">expr</var> pour indiquer toute expression PHP valide.
 </p>
</div>
<?php manual_footer($setup); ?>