• Aucun résultat trouvé

Syntaxe alternative

3 Copyright, distribution, historique

9.3 Les structures de contrôle

9.3.4 Syntaxe alternative

[Notes en ligne]

Le PHP propose une autre manière de rassembler des instructions à l'intérieur d'un bloc, pour les fonctions de contrôle if, while, for, et switch. Dans chaque cas, le principe est de remplacer l'accolade d'ouverture par deux points (:) et l'accolade de fermeture par, respectivement, endif;, endwhile;, endfor;, ou endswitch;. <?php if ($a == 5): ?> A is equal to 5 <?php endif; ?>

Dans l'exemple ci−desssus, le block HTML "A = 5" est inclus à l'intérieur d'un if en utilisant cette nouvelle syntaxe. Ce code HTML ne sera affiché que si la variable $a est égale à 5.

Cette autre syntaxe fonctionne aussi avec le else et elseif. L'exemple suivant montre une structure avec un if, un elsif et un else utilisant cette autre syntaxe: if ($a == 5): print "a equals 5"; print "..."; elseif ($a == 6):

print "a equals 6"; print "!!!"; else: print "a is neither 5 nor 6"; endif;

Allez voir 9.3.5 while, 9.3.7 for, et 9.3.1 if pour d'autres exemples.

9.3.5 while

[Notes en ligne]

La boucle while est le moyen le plus simple d'implémenter une boucle en PHP. Cette boucle se comporte de la même manière qu'en C. L'exemple le plus simple d'une boucle while est le suivant : while (expr) statement La signification d'une boucle while est très simple. Le PHP exécute l'instruction tant que l'expression de la boucle while est évaluée comme TRUE. La valeur de l'expression est vérifiée à chaque début de boucle, et, si la valeur change durant l'exécution de l'instruction, l'exécution ne s'arrêtera qu'à la fin de l'itération (chaque fois que le PHP exécute l'instruction, on appelle cela une itération). De temps en temps, si l'expression du while est FALSE avant la première itération, l'instruction ne sera jamais exécutée.

Comme avec le if, vous pouvez regrouper plusieurs instructions dans la même boucle while en les regroupant à l'intérieur de parenthèses ou en utilisant la syntaxe suivante: while (expr): statement ... endwhile;

Les exemples suivants sont identiques, et affichent tous les nombres de 1 à 10: /* exemple 1 */ $i = 1; while ($i <= 10) { print $i++; /* La valeur affiche est $i avant l'incrémentation (post−incrémentation) */ } /*

exemple 2 */ $i = 1; while ($i <= 10): print $i; $i++; endwhile;

PHP 4.0 Manuel de Référence.

9.3.3 elseif [Notes en ligne] 78

9.3.6 do..while

[Notes en ligne]

Les boucles do..while ressemblent beaucoup aux boucles while, mais l'expression est testée à la fin de chaque itération plutôt qu'au début. La principale différence par rapport à la boucle while est que la première itération de la boucle do..while est toujours exécutée (l'expression n'est testée qu'à la fin de l'itération), ce qui n'est pas le cas lorsque vous utilisez une boucle while (l'expression est vérifiée au début de chaque itération).

Il n'y a qu'un syntaxe possible pour les boucles do..while: $i = 0; do { print $i; } while ($i>0);

La boucle ci−dessus ne va être exécutée qu'une seule fois, car lorsque l'expression est évaluée, elle vaut FALSE (car la variable $i n'est pas plus grande que 0) et l'exécution de la boucle s'arrête.

Les utilisateurs familiers du C sont habitués à une utilisation différente des boucles do..while , qui permet de stopper l'exécution de la boucle au milieu des instructions, en l'encapsulant dans un do..while(0) la fonction 9.3.9 break. Le code suivant montre une utilisation possible: do { if ($i < 5) { print "i n'est pas suffisamment grand"; break; } $i *= $factor; if ($i < $minimum_limit) { break; } print "i est bon"; ...process i... } while(0);

Ne vous inquiétez pas si vous ne comprenez pas tout correctement. Vous pouvez écrire des scripts très très puissants sans utiliser cette fonctionnalité.

9.3.7 for

[Notes en ligne]

Les boucles for sont les boucles les plus complexes en PHP. Elles fonctionnent comme les boucles for du langage C. La syntaxe des boucles for est la suivante: for (expr1; expr2; expr3) statement

La première expression (expr1) est évaluée (exécutée), quoi qu'il arrive au début de la boucle.

Au début de chaque itération, l'expression expr2 est évaluée. Si l'évaluation vaut TRUE, la boucle continue et l'instruction est exécutée. Si l'évaluation vaut FALSE, l'exécution de la boucle s'arrête.

A la fin de chaque itération, l'expression expr3 est évaluée (exécutée).

Les expressions peuvent éventuellement être laissées vides. Si l'expression expr2 est laissée vide, cela signifie que c'est une boucle infinie (PHP considère implicitement qu'elle vaut TRUE, comme en C). Cela n'est pas vraiment très utile, à moins que vous souhaitiez terminer votre boucle par l'instruction conditionnelle 9.3.9 break.

Considérons les exemples suivants. Tous affichent les chiffres de 1 à 10: /* exemple 1 */ for ($i = 1; $i <=

10; $i++) { print $i; } /* exemple 2 */ for ($i = 1;;$i++) { if ($i > 10) { break; } print $i; } /* exemple 3 */ $i

= 1; for (;;) { if ($i > 10) { break; } print $i; $i++; } /* exemple 4 */ for ($i = 1; $i <= 10; print $i, $i++) ; Bien évidemment, le premier exemple est le plus simple de tous (ou peut être le quatrième), mais vous pouvez aussi pensez qu'utiliser une expression vide dans une boucle for peut être utile parfois.

PHP supporte aussi la syntaxe alternative suivante pour les boucles for : for (expr1; expr2; expr3): statement;

...; endfor;

Les autres langages ont l'instruction foreach pour accéder aux éléments d'un tableau. PHP 3 ne dispose pas d'une telle fonction; PHP 4 en dispose (voir 9.3.8 foreach). En PHP 3, vous pouvez combiner 9.3.5

while avec list() et each() pour obtenir le même résultat. Reportez vous aux exemples de la documentation.

9.3.8 foreach

[Notes en ligne]

PHP4 (mais pas PHP3) inclus une commande foreach, comme en Perl ou d'autres langages. C'est un moyen simple de passer en revue un tableau. Il y a deux syntaxes possibles : la seconde est une extension mineure mais pratique de la première: foreach(array_expression as $value) statement foreach(array_expression as

$key => $value) statement

La première forme passe en revue le tableau array_expression. A chaque itération, la valeur de l'élément PHP 4.0 Manuel de Référence.

9.3.6 do..while [Notes en ligne] 79

courant est assigné à $value et le pointeur interne de tableau est avancé d'un élément (ce qui fait qu'à la prochaîne itération, on accédera à l'élément suivant).

La deuxième forme fait exactement la même chose, mais c'est la clé de l'élément courant qui est assigné à la variable $key.

Lorsque foreach démare, le pointeur interne de fichier est automatiquement ramené au premier élément du tableau. Cela signifie que vous n'aurez pas à faire appel à reset() avant foreach.

Vous pouvez remarquer que les exemples suivants fonctionnent de manière identique : reset ($arr); while (list(, $value) = each ($arr)) { echo "Valeur: $value<br>\n"; } foreach ($arr as $value) { echo "Valeur:

$value<br>\n"; } Les exemples suivants sont aussi fonctionnellement identiques : reset ($arr); while (list($key, $value) = each ($arr)) { echo "Clé: $key; Valeur: $value<br>\n"; } foreach ($arr as $key =>

$value) { echo "Clé: $key; Valeur: $value<br>\n"; }

Voici quelques exemples de plus : /* exemple 1: valeur seule */ $a = array (1, 2, 3, 17); foreach ($a as $v) { print "Valeur courante de \$a: $v.\n"; } /* exemple 1: valeur (avec clé associée) */ $a = array (1, 2, 3, 17); $i

= 0; /* pour affichage seulement*/ foreach($a as $v) { print "\$a[$i] => $k.\n"; } /* exemple 1: valeur et clé

*/ $a = array ( "one" => 1, "two" => 2, "three" => 3, "seventeen" => 17 ); foreach($a as $k => $v) { print

"\$a[$k] => $v.\n"; }

9.3.9 break

[Notes en ligne]

L'instruction break permet de sortir d'une structure if, for, while, ou switch.

break accepte un argument numérique optionnel qui vous indiquera combien de structures emboîtées ont été interrompues.

$i = 0; while ($i < 10) { if ($arr[$i] == "stop") { break; /* Vous pouvez aussi écrire 'break 1;' ici. */ } $i++; } /* Utilisation de l'argument optionnel. */ $i = 0; while ( ++$i ) { switch ( $i ) { case 5: echo "à 5<br>\n";

break 1; /* Ne sort que du switch. */ case 10: echo "à 10; quitting<br>\n"; break 2; /* Sort du switch et du while. */ default: break; } }

9.3.10 continue

[Notes en ligne]

L'instruction continue est utilisée dans une boucle afin d'éluder les instructions de l'itération courante afin de passer directement à l'itération suivante.

continue accepte un argument numérique optionnel qui vous indiquera combien de structures emboîtées ont été ignorées.

while (list ($cle, $valeur) = each ($arr)) { if (!($cle % 2)) { // évite les membres impairs continue; } fonction_quelconque($valeur); } $i = 0; while ($i++ < 5) { echo "Dehors<br>\n"; while (1) { echo

" Milieu<br>\n"; while (1) { echo " Intérieur<br>\n"; continue 3; } echo "Ceci n'est jamais atteint.<br>\n"; } echo "Ceci non plus.<br>\n"; }

9.3.11 switch

[Notes en ligne]

L'instruction switch équivaut à une série d'instructions if. En de nombreuses occasions, vous aurez besoin de comparer la même variable (ou expression) avec un grand nombre de valeurs différentes, et d'exécuter différentes parties de code suivant la valeur à laquelle elle est égale. C'est exactement à cela que sert l'instruction switch.

L4es deux exemples suivants sont deux manières différentes d'écrire la même chose, l'une en utilisant une séries de if, et l'autre en utilisant l'instruction switch: if ($i == 0) { print "i égale 0"; } if ($i == 1) { print "i

PHP 4.0 Manuel de Référence.

9.3.9 break [Notes en ligne] 80

égale 1"; } if ($i == 2) { print "i égale 2"; } switch ($i) { case 0: print "i égale 0"; break; case 1: print "i égale 1"; break; case 2: print "i égale 2"; break; }

Il est important de comprendre que l'instruction switch exécute chacune des clauses dans l'ordre. L'instruction switch est exécutée ligne par ligne. Au début, aucun code n'est exécuté. Seulement lorsqu'un case est vérifié, PHP exécute alors les instructions correspondantes. PHP continue d'exécuter les instructions jusqu'à la fin du bloc d'instructions du switch, ou bien dès qu'il trouve l'instruction break. Si vous ne pouvez pas utiliser l'instruction break à la fin de l'instruction case, PHP continuera à exécuter toutes les instructions qui suivent.

Par exemple : switch ($i) { case 0: print "i égale 0"; case 1: print "i égale 1"; case 2: print "i égale 2"; } Dans cet exemple, si $i est égal à 0, PHP va exécuter quand même toutes les instructions qui suivent. Si $i est égal à 1, PHP exécutera les deux dernières instructions. Et seulement si $i est égal à, vous obtiendrez le résultat escompté, c'est−à−dire, l'affiche de "i égal 2. Donc, l'important est de ne pas oublier l'instruction break (même si il est possible que vous l'omettiez dans certaines circonstances).

Dans une commande switch, une condition n'est évaluée qu'une fois, est le résultat est comparé à chaque case.

Dans une structure elseif, les conditions sont évaluées à chaque comparaison. Si votre condition est plus compliquée qu'une simple comparaison, ou bien fait partie d'une boucle, switch sera plus rapide.

La liste de commande d'un case peut être vide, auquel cas PHP utilisera la liste de commandes du cas suivant.

switch ($i) { case 0: case 1: case 2: print "i est plus petit que 3 mais n'est pas négatif"; break; case 3: print "i égale 3"; }

Un case spécial est default. Ce cas est utilisé lorsque tous les case ont échoués. Par exemple : switch ($i) { case 0: print "i égale 0"; break; case 1: print "i égale 1"; break; case 2: print "i égale 2"; break; default: print "i n'est ni égal à 2, ni à 1, ni à 0."; }

Une autre chose à mentionner est que l'instruction case peut être une expression à de type scalaire,

c'est−à−dire nombre entier, nombre à virgule flottante et chaîne de caractère. Les tableaux sont sans interêt dans ce contexte−là.

La syntaxe alternative pour cette structure de contrôle est la suivante : pour plus d'informations, voir 9.3.4 Syntaxe alternative). switch ($i): case 0: print "i égale 0"; break; case 1: print "i égale 1"; break; case 2: print

"i égale 2"; break; default: print "i n'est ni égal à 2, ni à 1, ni à 0"; endswitch;

9.3.12 require()

[Notes en ligne] [Exemples]

La commande require() se remplace elle même par le contenu du fichier spécifié, comme les préprocesseurs C le font avec la commande #include.

Il est important de noter que lorsqu'un fichier est include() ou require(), les erreurs d'analyse apparaîtront en HTML tout au début du fichier, et l'analyse du fichier parent ne sera pas interrompue. Pour cette raison, le code qui est dans le fichier doit être placé entre 9.1.1 Le passage du HTML au PHP.

require() n'est pas vraiment une fonction PHP : c'est plus un instruction du langage. Elle ne fonctionne pas comme les fonctions standards. Par exemple, require() ne peut pas contenir d'autres structures de contrôle. De plus, il ne retourne aucune valeur. Lire une valeur retournée par un require() retourne une erreur d'analyse.

Contrairement à include(), require() va toujours lire dans le fichier cible, même si la ligne n'est jamais

exécutée. Si vous souhaitez une inclusion conditionnelle, utilisez include(). La condition ne va jamais affecter require(). Cependant, si la ligne de require() n'est jamais exécutée, le code du fichier ne le sera jamais non plus.

Les boucles n'affectent pas le comportement de require(). Même si le code contenu dans le fichier source est appelé dans la boucle, require() n'est exécuté qu'une fois.

Cela signifie qu'on ne peut pas mettre un require() dans une boucle, et s'attendre à ce qu'il inclue du code à chaque itération. Pour cela, il faut utiliser include(). require ('header.inc');

Attention : include() et require() ajoute le contenu du fichier cible dans le script lui−même. Elle n'utilise pas le protocole HTTP ou tout autre protocole. Toute variable qui est dans le champs du script sera accessible dans le fichier d'inclusion, et vice versa. require ("file.inc?varone=1&vartwo=2"); /* Ne fonctionne pas. */

PHP 4.0 Manuel de Référence.

9.3.12 require() [Notes en ligne] [Exemples] 81

$varone = 1; $vartwo = 2; require ("file.inc"); /* $varone et $vartwo seront accessible à file.inc */

Ne vous laissez pas abuser par le fait que vous pouvez requérir ou inclure des fichiers via HTTP en utilisant la fonctionnalité de 8.8 Utilisation des fichiers à distance ce qui est au dessus reste vrai.

En PHP3, il est possible d'exécuter une commande return depuis un fichier inclus, tant que cette commande intervient au niveau global du fichier inclus. Elle ne doit intervenir dans aucun bloc (entre accolade {}). En PHP4, cette possibilité a été supprimée. Si vous en avez besoin, utilisez plutôt include().

9.3.13 include()

[Notes en ligne] [Exemples]

La fonction include() inclus et évalue le fichier spécifié en argument.

Il est important de noter que lorsqu'un fichier est include() ou require(), les erreurs d'analyse apparaîtront en HTML tout au début du fichier, et l'analyse du fichier parent ne sera pas interrompue. Pour cette raison, le code qui est dans le fichier doit être placé entre 9.1.1 Le passage du HTML au PHP.

Cela a lieu à chaque fois que la fonction include() est rencontrée. Donc vous vous pouvez utiliser la fonction include() dans une boucle pour inclure un nombre infini de fois un fichier, ou même des fichiers différents.

$files = array ('first.inc', 'second.inc', 'third.inc'); for ($i = 0; $i < count($files); $i++) { include $files[$i]; } include() diffère de require() car le fichier inclus est ré−évaluée à chaque fois que la commande est exécutée, tandis que require() est remplacée par le fichier cible lors de la première exécution, que son contenu soit utilisé ou non. De plus, cela se fait même si il est placé dans une structure conditionnelle, comme dans un 9.3.1 if).

Parce que la fonction include() nécessite une construction particulière, vous devez l'inclure dans un bloc si elle est inclue dans une structure conditionnelle. /* Ceci est faux, et ne fonctionnera pas ce qu'on attend. */ if ($condition) include($file); else include($other); /* Ceci est CORRECT. */ if ($condition) { include($file); } else { include($other); }

En PHP3, il est possible d'exécuter une commande return depuis un fichier inclus, tant que cette commande intervient au niveau global du fichier inclus. Elle ne doit intervenir dans aucun bloc (entre accolade {}). En PHP4, cette possibilité a été supprimée. Cependant, PHP4 vous autorise à retourner des valeurs d'un fichier inclus. Vous pouvez traiter include() comme une fonction normale, qui retourne une valeur. Mais cela génère une erreur d'analyse en PHP3.

include() en php3 et php4

On suppose que le fichier `test.inc' existe, et est placé dans le même dossier que le fichier principal :

<;php

echo "Avant le retour<br>\n";

if (1) { return 27;

}

echo "Après le retour <br>\n";

?>

On suppose que le fichier `main.html' contient ceci :

<;php

$retval = include ('test.inc');

echo "Fichier inclus: '$retval'<br>\n";

?>

Lorsque `main.html' est appelé en PHP3,

il va générer une erreur d'analyse (parse error)

PHP 4.0 Manuel de Référence.

9.3.13 include() [Notes en ligne] [Exemples] 82

à la ligne 2; vous ne pouvez pas vous attendre à un retour sur une fonction include() en PHP3. En

PHP4, cependant,le résultat sera :

Avant le retour Ficher inclus : '27'

Supposons maintenant que `main.html' a été modifié et contient maintenant le code suivant : php include ('test.inc'); echo "Retour dans le main.html<br>\n"; ?>

En PHP4, l'affichage sera :

Avant le retour

Retour dans le main.html

Au contraire, PHP3 affichera :

Avant le retour

27Retour dans le main.html

Parse error: parse error in /home/torben/public_html/phptest/main.html on line 5

L'erreur d'analyse ci−dessus est le résultat du fait que la commande return est dans un bloc qui n'est pas une fonction, dans `test.inc'. Lors que le return est sorti du bloc, l'affichage devient :

Avant le retour

27Retour dans le main.html

Le '27' est du au fait que PHP3 ne supporte pas le return dans ces fichiers.

Il est important de noter que lorsqu'un fichier est include() ou require(), les erreurs d'analyse apparaîtront en HTML tout au début du fichier, et l'analyse du fichier parent ne sera pas interrompue. Pour cette raison, le code qui est dans le fichier doit être placé entre 9.1.1 Le passage du HTML au PHP. include

("file.inc?varone=1&vartwo=2"); /* ne fonctionne pas. */ $varone = 1; $vartwo = 2; include ("file.inc"); /*

$varone et $vartwo sont accessibles dans file.inc */

Ne vous laissez pas abuser par le fait que vous pouvez requérir ou inclure des fichiers via HTTP en utilisant la fonctionnalité de 8.8 Utilisation des fichiers à distance ce qui est au dessus reste vrai.

Voir aussi readfile(), require() et virtual().