Les expressions

Les expressions sont les pièces de construction les plus importantes de PHP. En PHP, presque tout ce qui s'écrit est une expression. La manière la plus simple de définir une expression est : "tout ce qui a une valeur".

Les formes les plus simples d'expressions sont les constantes et les variables. Lorsque l'on écrit $a = 5, on assigne la valeur 5 à la variable $a. Bien évidemment, 5 vaut 5 ou, en d'autres termes, 5 est une expression avec pour valeur 5 (dans ce cas, 5 est un entier constant).

Après cette assignation, on peut considérer que $a a pour valeur 5 et donc, écrire $b = $a, revient à écrire $b = 5. En d'autres termes, $a est une expression avec une valeur de 5. Si tout fonctionne correctement, c'est exactement ce qui arrive.

Un exemple plus complexe concerne les fonctions. Par exemple, considérons la fonction suivante :

<?php
function foo ()
{
return
5;
}
?>

En supposant une familiarité avec le concept de fonction, (si ce n'est pas le cas, consulter le chapitre concernant les fonctions), on conviendra que $c = foo() est équivalent à $c = 5, et c'est tout à fait exact. Les fonctions sont des expressions qui ont la valeur de leur "valeur de retour". Si foo() renvoie 5, la valeur de l'expression foo() est 5. Habituellement, les fonctions ne font pas que renvoyer une valeur constante, mais réalisent des traitements.

Bien sûr, les valeurs en PHP n'ont pas à être des valeurs numériques, comme c'est souvent le cas. PHP supporte quatre types de variables scalaires : les valeurs entières (entier), les nombres à virgule flottante (float), les chaînes de caractères (chaîne de caractères) et les booléens (bool). (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.

PHP va plus loin dans la gestion des expressions, comme le font d'autres langages. PHP est un langage orienté expression, dans le sens où presque tout est une expression. Considérons l'exemple dont nous avons déjà parlé, $a = 5. Il est facile de voir qu'il y a deux valeurs qui entrent en jeu ici, la valeur de la constante entière 5 et la valeur de la variable $a qui est mise à jour à la valeur 5. Mais, la vérité est qu'il y a une autre valeur qui entre en jeu ici et c'est la valeur de l'assignation elle-même. L'assignation elle-même est assignée à une valeur, dans ce cas-là 5. En pratique, cela signifie que $a = 5 est une expression qui a pour valeur 5. Donc, écrire $b = ($a = 5) revient à écrire $a = 5; $b = 5; (un point-virgule marque la fin d'une instruction). Comme les assignations sont analysées de droite à gauche, il est aussi possible d'écrire $b = $a = 5.

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 variable++ et variable--. Ce sont les opérateurs d'incrémentation et de décrémentation. PHP ajoute les possibilités d'incrémentation et de décrémentation comme c'est le cas dans le langage C. En PHP, comme en C, il y a deux types d'opérateurs d'incrémentation (pre-incrémentation et post-incrémentation). Les deux types d'opérateur d'incrémentation jouent le même rôle (c'est-à-dire qu'ils incrémentent la variable). La différence vient de la valeur de l'opérateur d'incrémentation. L'opérateur de pre-incrémentation, qui s'écrit ++$variable, évalue la valeur incrémentée (PHP incrémente la variable avant de lire la valeur de cette variable, d'où le nom de pre-incrémentation). L'opérateur de post-incrémentation, qui s'écrit $variable++ , évalue la valeur de la variable $variable avant de l'incrémenter (PHP incrémente la variable après avoir lu sa valeur, d'où le nom de post-incrémentation).

Un type d'expression très commun est l'expression de comparaison. Ces expressions sont évaluées à false ou true, respectivement. PHP supporte les opérateurs de comparaison > (plus grand que), >= (plus grand ou égal), == (égal à), != (différent de), < (plus petit que) et <= (plus petit ou égal). Le langage supporte également un ensemble d'opérateurs d'é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'instruction if.

Pour le dernier exemple d'expression, nous allons parler des combinaisons d'opérateurs/assignation. Pour incrémenter la variable $a d'une unité, il suffit d'écrire $a++ ou ++$a. Mais pour ajouter la valeur 3 à la variable ? Il est possible d'écrire plusieurs fois $a++, mais ce n'est pas la meilleure des méthodes. Une pratique plus courante est d'écrire $a = $a + 3. L'expression $a + 3 correspond à la valeur $a plus 3, et est de nouveau assignée à la variable $a. Donc, le résultat est l'incrémentation de 3 unités de la variable $a. En PHP, comme dans de nombreux autres langages comme le C, il est possible d'é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 $a peut s'écrire $a += 3. Cela signifie précisément : "on prend la valeur de la variable $a, on ajoute la valeur 3 et on assigne cette valeur à la variable $a". Et pour être plus concis et plus clair, cette expression est plus rapide. La valeur de l'expression $a += 3, comme l'assignation d'une valeur quelconque, est la valeur assignée. Il est à noter que ce n'est pas 3, mais la combinaison de la valeur de la variable $a plus la valeur 3. (c'est la valeur qui est assignée à la variable $a). N'importe quel opérateur binaire peut utiliser ce type d'assignation, par exemple $a -= 5 (soustraction de 5 de la valeur de la variable $a), $b *= 7 (multiplication de la valeur de la variable $b par 7).

Il y a une autre expression qui peut paraître complexe si elle n'a pas été vue dans d'autres langages, l'opérateur conditionnel ternaire :

<?php
$first
? $second : $third
?>

Si la valeur de la première sous-expression est vraie (true) (différente de 0), alors la deuxième sous-expression est évaluée et constitue le résultat de l'expression conditionnelle. Sinon, c'est la troisième sous-expression qui est évaluée et qui constitue le résultat de l'expression.

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 :

<?php
function double($i)
{
return
$i*2;
}

$b = $a = 5; /* Assigne la valeur 5 aux variables $a et $b */
$c = $a++; /* Post-incrémentation de la variable $a et assignation de
la valeur à la variable $c */
$e = $d = ++$b; /* Pre-incrémentation, et assignation de la valeur aux
variables $d et $e */
/* à ce niveau, les variables $d et $e sont égales à 6 */
$f = double($d++); /* assignation du double de la valeur de $d à la variable $f ($f vaut 12),
puis incrémentation de la valeur de $d */
$g = double(++$e); /* assigne deux fois la valeur de $e après
incrémentation, 2*7 = 14 à $g */
$h = $g += 10; /* Tout d'abord, $g est incrémentée de 10, et donc $g vaut 24.
Ensuite, la valeur de $g, (24) est assignée à la variable $h,
qui vaut donc elle aussi 24. */
?>

Au début de ce chapitre, nous avons dit que nous allions décrire les différents types d'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 'expr ;', c'est-à-dire, une expression suivie par un point-virgule. Dans $b = $a = 5;, $a = 5 est une expression valide, mais ce n'est pas une instruction en elle-même. $b = $a = 5; est une instruction valide.

La dernière chose qui mérite d'être mentionnée est la véritable valeur des expressions. Lors de tests sur une variable, dans une boucle conditionnelle par exemple, il n'est pas nécessaire de savoir quelle est la valeur exacte de l'expression. Seul importe de savoir si le résultat signifie true ou false. Les constantes true et false (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 section sur le transtypage pour plus de détails.

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'est une expression et comment construire des expressions utiles. Dans tout le reste de ce manuel, nous écrirons expr pour indiquer toute expression PHP valide.