Valeur d’une exprssion en PHP

March 3rd, 2007

Leçon du jour : les expressions et leurs valeurs en PHP. Commençons par les conditions:

PHP:
  1. <?php
  2. // Roulette russe
  3. if (rand(1,6) == 3) {
  4.     print ("Tu est mort !");
  5. }
  6. ?>

Le principe est simple, dans un if (<expression>), l'expression est évaluée et si il s'avère être équivalente à true alors la condition est validée. En PHP, tout (à l'exception des opérateurs) a pour but de retourner une valeur : une fonction retournera une valeur, ou une variable retournera une valeur (sans parler des valeurs elles mêmes...). Donc la première chose que fait PHP (ce n'est pas tout à fait exact, mais on reviendra sur ce point plus tard) dans l'évaluation de ces expressions, c'est de chercher les valeurs. Dans l'exemple précédent, on admettra que rand(1,6) retourne la valeur 3. Le if de l'exemple ressemble donc maintenant pour le moteur PHP à

PHP:
  1. if (3 == 3) {

Maintenant intervienne les opérateurs : l'opérateur == demande la comparaison des valeurs qui lui sont à sa droite et à sa gauche pour savoir si elles sont équivalentes (c'est à dire que si les deux valeurs ne sont pas du même type elles sont converties dans le même type puis comparées), et si c'est effectivement le cas il retournera le true que le if attend pour considérer que la condition soit vraie.

Mais les opérateurs de comparaison ne sont pas les seuls opérateurs existants. À commencer par les parenthèses : si une expression se trouve entre parenthèses, alors elle est d'abord évaluée puis sa valeur est retournée. Par exemple on peut avoir (on suppose toujours que rand(1,6) retourne la valeur 3):

PHP:
  1. <?php
  2. // Roulette russe
  3. if (($num = rand(1,6)) == (1+2)) {
  4.     print ("Tu est mort !");
  5. }
  6. else {
  7.     print ("T'as du bol d'être tombé sur le numéro " . $num);
  8. }
  9. ?>

Ici encore on se retrouvera avec un

PHP:
  1. if (3 == 3) {

Viennent ensuite les opérateurs logiques, et ce sont eux qui me font mentir sur la première partie : les opérateurs logiques (and, or, xor, not, ils sont détaillés dans le manuel) interviennent dans l'ordre des opérations. En effet, si deux expressions sont de part et d'autre d'un or, par définition il suffit que l'une seule d'entre elles soit vérifiée pour que la condition soit vraie. Donc si la première expression retourne une valeur équivalente à true, PHP n'a pas besoin d'évaluer la seconde puique la condition est validée. En revance pour and et xor les deux expressions sont évaluées puisque PHP a besoin de connaître les deux valeurs.

Vous devez maintenant penser que ces système de valeurs ne marchent que dans des conditions ou autre structures de contrôle (elseif, while, for, etc). Eh bien pas du tout : ça marche n'importe où dans le code. De cette manière on peut avoir quelquechose qui ressemble à

PHP:
  1. <?php
  2. $a = ($b = 3);
  3.  
  4. // Affiche 3
  5. echo $a;
  6. ?>

(il faut avouer que ceci ne sert à rien), on peut aussi faire (plus utile cette fois)

PHP:
  1. <?php
  2. /*
  3. * Ici on regarde les valeurs d'un formulaire qui peut être
  4. * envoyé soit par POST soit par GET
  5. */
  6. $actif = ($_POST["actif"] or $_GET["actif"]);
  7. ?>

ou encore (là c'est réélement utile)

PHP:
  1. <?
  2. /*
  3. * Dans cet exemple, la fonction maFonction() est une fonction quelconque
  4. * qui retourne <i>true</i> ou <i>false</i> selon qu'elle réussisse ou non.
  5. */
  6.  
  7. // Par la méthode classique
  8. if (!maFonction()) {
  9.     trigger_error("Erreur lors de l'éxecution de ma fonction !", E_USER_WARNING);
  10. }
  11.  
  12. // Et en utilisant or
  13. maFonction() or trigger_error("Erreur lors de l'éxecution de ma fonction !", E_USER_WARNING);
  14. ?>

Petite explication sur ce dernier : PHP évalue d'abord maFonction(), qui retourne soit true soit false. Si maFonction() retourne true alors PHP n'a pas besoin d'évaluer ce qui se trouve après le or, en revanche si maFonction() retoure false PHP doit évaluer la 2ème expression.

Et tant qu'on est sur les valeurs, on pourra signaler que l'on peut forcer le type d'une valeur lors d'un assignement en spécifiant simplement le type entre parenthèses juste après l'opérateur d'assignation. Par exemple :

PHP:
  1. <?php
  2. /* On récupère l'âge depuis un formulaire, mais il est
  3. * de type string, or on le veut de type int.
  4. */
  5. $age = (int) $_POST["age"];
  6. ?>

Je concluerai sur une dernière précision à propos de la sécurité : faites très attention à utiliser l'opérateur d'égalité (===) le plus possible au profit de l'opérateur d'équivalence (==) qui entraîne la conversion des types, ce qui peut mener à des abérations de logique ou des failles de sécurité (par exemple une faille de phpBB utilisait la conversion implicite des types pour devenir administrateur en modifiant simplement son identifiant de session...)

Voici donc un petit tour des valeurs en PHP, en espérant avoir été assez clair...

Entry Filed under: Trucs et astuces

Leave a Comment

hidden

Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe to the comments via RSS Feed


Calendar

September 2010
M T W T F S S
« Jun    
 12345
6789101112
13141516171819
20212223242526
27282930  

Most Recent Posts

Wikipedia Affiliate Button