V. PHP ETAPE 5▲
V-1. Les opérateurs▲
Rapidement les opérateurs essentiels :
<?php
/*
LES OPERATEURS ARITHMETIQUES
*/
//la variable reçoit 5 (simple égal : opérateur d'affectation)
$valeur
=
5
;
//plus et moins
$nombre
=
(4
+
6
)-
2
;
//$nombre vaudra 8;
//multiplier ou diviser
$nombre
=
(4
*
6
)/
2
;
//$nombre vaudra 12;
//Priorités si vous ne mettez pas de parenthèses :
$valeur
=
4
+
6
*
2
;
//multiplier ou diviser est prioritaire.
//Si vous risquez d'oublier, sécurisez avec des parenthèses...
$valeur
=
4
+
(6
*
2
);
//Sans parenthèses, cela revient à 16;
//Si vous souhaitez une autre priorité, déplacez les parenthèses :
$valeur
=
(4
+
6
)*
2
;
//Cela revient à 20;
//modulo ou ce qui reste après division entière
$nombre
=
6
%
2
;
//$nombre renverra 0 (car 6 est divisible par 2 donc reste zéro).
$nombre
=
27
%
4
,
//$nombre renverra 3 (car 6x4=24 reste 3).
//comparer
//RAPPEL IMPORTANT : penser au double égal
if
($nombre
==
4
)
//son contraire
if
($nombre
!=
4
)
//Différent de
//inférieur, supérieur
if
($nombre
<
4
)
if
($nombre
>
4
)
//inférieur ou égal, supérieur ou égal
if
($nombre
<=
4
)
if
($nombre
>=
4
)
/*
LES COMPARAISONS LOGIQUES
*/
//si l'âge est compris entre 15 et 25 ans :
if
(($age
>=
15
)&&
($age
<=
25
))
//Notez && pour le 'et' logique (AND marche aussi)
//Notez les parenthèses imbriquées pour chaque sous-condition
//si $truc est 'papa' ou 'maman'
//RAPPEL IMPORTANT : penser au double égal de comparaison
if
(($truc
==
'papa'
)||
($truc
==
'maman'
)){
echo'Chouette, mes parents !'
;
}
//Notez || (2 fois la touche AltGr+6) pour le 'ou' logique
//on l'appelle aussi le ou inclusif (OR marche aussi)
//Notez les parenthèses imbriquées pour chaque sous-condition
?>
V-2. Les fonctions▲
V-2-a. Les fonctions dans la page▲
Imaginons le problème suivant. Votre programme affiche les notes/20 d'un élève.
Vous souhaitez mettre en rouge toutes les notes (strictement) inférieures à 10.
Vous souhaitez mettre en vert toutes les notes supérieures (ou égales) à 15.
Cela veut dire qu'à chaque apparition d'une note, il faut la tester et lui appliquer la couleur adéquate.
Comme c'est une tâche répétitive, on va la mettre en forme dans une fonction.
Voici comment opérer :
On place évidemment la fonction que l'on va construire au début du code, avant de l'utiliser.
Par exemple, dans le début du body (au sein de balises PHP bien sûr).
Mais on ne la crée qu'une fois, tandis qu'on la convoque autant qu'on veut un peu plus loin sur le même fichier PHP.
C'est pourquoi on va lui donner un nom simple à retenir (comme les variables, les noms de fonctions sont libres, il faut juste bannir les espaces et les accents.)
Bien entendu, il faut aussi retenir une chose : c'est que si le nom de votre fonction est libre, une fois que vous l'avez choisi, vous ne pourrez le convoquer qu'en ne changeant rien (ni une lettre, ni une majuscule ou minuscule)...
Mais bon, vous devez commencer à comprendre que comme tout langage de programmation, PHP ne supporte aucune coquille.
Le cadre de notre fonction se présentera ainsi :
function colore($nombre){
toutes les instructions se situeront à l'intérieur de ces accolades;
et se termineront par un ;
}
Dans la création de la fonction, il est obligatoire de commencer par écrire function, ensuite vient le nom (libre).
Enfin ici, notre fonction comporte un paramètre (une variable imaginaire, $nombre, dont on ne connaît pas encore la valeur)...
On fait comme si $nombre existait déjà, et on fait le petit bout de code qui effectue ce qu'on veut obtenir :
<?php
function
colore($nombre
){
if
($nombre
<
10
){
echo'<font color="red">'
.
$nombre
.
'</font>'
;
}
elseif
($nombre
>=
15
){
echo'<font color="green">'
.
$nombre
.
'</font>'
;
}
//cas par défaut(noir)
else
{
echo $nombre
;
}
}
?>
Vous voulez tester jusqu'au bout cette nouvelle fonction ?
<?php
//Construisons notre tableau de notes :
$notes
=
array
(2
,
5
,
7
,
10
,
11
,
13
,
15
,
17
,
18
);
/*Scannons-le grâce à une boucle foreach du type
echo 'Vos notes du trimestre :<br/>';
foreach($notes as $note){
echo '- '.$note.'<br/>';
}*/
//Et maintenant, précisons notre boucle foreach pour y convoquer notre fonction.
echo 'Vos notes du trimestre :<br/>'
;
foreach
($notes
as
$note
){
echo '- '
.
colore($note
).
'<br/>'
;
}
?>
En définitive, notre fichier notes.php complet donnera ceci :
<
html>
<
head><title>
Notes du trimestre<
/title
></head
>
<
body>
<?php
//Cette fonction colore en rouge les notes<10
//et en vert les notes >=15
function
colore($nombre
){
if
($nombre
<
10
){
echo'<font color="red">'
.
$nombre
.
'</font>'
;
}
elseif
($nombre
>=
15
){
echo'<font color="green">'
.
$nombre
.
'</font>'
;
}
//cas par défaut(affiche sans modifier couleur)
else
{
echo $nombre
;
}
}
//Construisons notre tableau de notes :
$notes
=
array
(2
,
5
,
7
,
10
,
11
,
13
,
15
,
17
,
18
);
//La boucle foreach scanne le tableau
//en appliquant la fonction colore
echo 'Vos notes du trimestre :<br/>'
;
foreach
($notes
as
$note
){
echo '- '
;
colore($note
);
echo '<br/>'
;
}
?>
<
/body
>
<
/html
>
Vous serez peut-être étonné du fait que cela fonctionne, bien que votre fonction disait colore($nombre) et que lorsque vous la convoquez, vous dites colore($note)...
Mais ça ne pose aucun problème. Le nom même de l'attribut au sein de la fonction est celui que vous voulez.
Quand vous la convoquez, il remplace de toute façon la variable 'théorique' de la fonction par la variable courante que vous lui passez en attribut...
V-2-b. Plusieurs paramètres passés à la fonction▲
Une remarque importante, en ce qui concerne les fonctions : elle peuvent être définies avec plusieurs paramètres.
Par exemple, je peux définir une fonction moyenne annuelle telle qu'elle soit la moyenne des trois trimestres scolaires :
<?php
function
MoyenneAnnuelle($trim1
,
$trim2
,
$trim3
){
$MA
=
($trim1
+
$trim2
+
$trim3
)/
3
;
echo 'Votre moyenne annuelle : '
.
$MA
;
}
?>
Dans ce cas, pour la convoquer, on pourra écrire :
<?php
MoyenneAnnuelle(8
,
10
,
12
);
//ceci aura pour résultat :
// Votre moyenne annuelle : 10
?>
V-2-c. Les fonctions dans un fichier à part▲
Si vous développez un programme un peu ambitieux, vous aurez un certain nombre de fonctions.
Vous pouvez tout-à-fait les mettre à part dans un fichier voisin que vous appelleriez fonctions.php par exemple, ou comme vous voulez en fait.
Il vous suffira ensuite de le convoquer une seule fois au tout début de chacune de vos pages php, au sein de balises PHP bien entendu :
Par la formule suivante
<?php
include('fonctions.php'
);
?>
Ceci vous permet ensuite de convoquer n'importe quelle fonction définie dans votre page fonctions.php.
Par exemple, vous avez développé tout un site et vous souhaitez sur chacune des pages signaler le dernier événement mis à jour.
Vous pourriez procéder ainsi :
Dans fonctions.php, vous rédigez cette fonction :
<?php
function
DerniereMaj(){
echo'Dernière parution mise à jour :<br/>
PIF GADGET<br/>
le 10/01/2009'
;
}
?>
Dans chacune des pages de votre site maintenant, vous vous contentez de mettre, à l'endroit où vous souhaitez que votre avis de mise à jour (maj) apparaisse, la ligne suivante :
<?php
DerniereMaj();
?>
Bien entendu aussi, vous aurez songé auparavant à mettre votre "include" de la page fonctions.php dans chaque page de votre site...
Ceci vous permettra, à chaque nouvel avis de maj, de changer centralement et une seule fois dans fonctions.php votre texte.
Et cela aura pour conséquence de le changer sur chacune de vos pages.
Par exemple :
<?php
function
DerniereMaj(){
echo'Dernier publication mise à jour :<br/>
PIF ET PIFOU<br/>
le 13/01/2009'
;
}
//etc...
?>
Vous remarquerez que la fonction DerniereMaj n'a pas de paramètres. C'est une simple fonction d'affichage.
Une fonction sans paramètres conserve toutefois les parenthèses vides, dans sa définition comme à chaque convocation.
V-2-d. Fonction qui renvoie une valeur de retour▲
Une dernière chose sur les fonctions : Si l'on ne veut pas une fonction qui affiche, mais une fonction qui par exemple calcule et renvoie une valeur, on utilisera le mot clé return.
Par exemple, réalisons une fonction qui nous retourne le verdict du nombre que l'on vient d'entrer : pair ou impair ?
<
html>
<
head><title><Pair ou impair ?</title
></head
>
<
body>
<?php
//fonction qui fait le diagnostic
function
parite($nombre
){
//si le reste de la division est zéro, c'est pair
if
(($nombre
%
2
)==
0
){
//on initialise les deux valeurs de verdict
$verdict
=
'pair'
;
}
else
{
$verdict
=
'impair'
;
}
//on renvoie le verdict, tout à la fin
return
$verdict
;
}
?>
<
form method
=
"
POST
"
action
=
"
fonction.php
"
>
Entrez votre nombre<
input type
=
"
text
"
name
=
"
num
"
/
>
<
input type
=
"
submit
"
name
=
"
valider
"
value
=
"
OK
"
/
>
<
/form
>
<?php
//si user a cliqué OK
if
(isset($_POST
[
'valider'
]
)){
//récupère la valeur entrée
$nombre
=
$_POST
[
'num'
];
//place dans $toto la valeur de retour de ma fonction
$toto
=
parite($nombre
);
//affiche le verdict entier
echo 'Ce nombre est '
.
$toto
.
'.'
;
}
?>
<
/body
>
<
/html
>
Quelques commentaires supplémentaires : return stoppe la fonction.
Il faut donc le placer en tout dernier, juste avant l'accolade finale qui ferme la fonction.
Pour la même raison, return ne peut renvoyer qu'une seule valeur, libre à vous cependant de rendre cette valeur complexe comme un tableau.
Une dernière chose, au moment de la convocation d'une fonction qui retourne une valeur, bien penser à "ranger" la valeur retournée dans une variable "réception", peu importe son nom (c'est bien pourquoi je l'ai appelée ici $toto)...
V-3. La boucle for▲
Une boucle for, c'est une boucle qui dit "pour chaque valeur de tant à tant, recommence".
Traditionnellement, $i est le nom de la variable qui sert un peu de compteur pour une boucle for, mais rien n'interdit de lui donner un nom plus explicite.
La syntaxe de cette boucle est la suivante :
<?php
//Copiez-moi 50 fois la punition !!!
//pour i égal zéro, i inférieur à 50, i plus plus
for
($i
=
0
;
$i
<
50
;
$i
++
){
echo 'Je ne tricherai plus à un devoir. Limite je meurs de honte là.<br/>'
;
}
?>
Plusieurs remarques :
Puisque $i commence à 0 et non à 1 (oui, pareil que pour les indices de tableaux), pensez bien à mettre ensuite strictement inférieur à la valeur de la limite supérieure de la boucle.
Ici on peut traduire par : pour $i de 0 à 49, ce qui fait bien... 50 tours de boucle.
Bon en plus, si vous en avez marre de commencer à zéro, vous pouvez commencer à 1 ou à ce que vous voulez pour les boucles (c'est pas comme les tableaux)...
Mais c'est la syntaxe suivante : $i++ qui doit vous sembler un peu surprenante.
Elle signifie $i=$i+1;
Autrement dit, augmente notre compteur de 1 à chaque tour de boucle, cela se nomme aussi l'incrémentation.
V-4. La commande switch▲
Voici une commande qui est une condition, en tout cas, qui gère très simplement, le principe des conditions multiples un peu lourd à gérer avec des if, elseif, else, if imbriqués, ordre des if, cas particulier qui vient faire planter tout notre échaffaudage laborieux de conditions etc.
Nous verrons plus tard pourquoi cette commande switch est quasiment vitale en PHP.
Pour l'instant, contentons-nous d'en comprendre la structure.
Switch, c'est un interrupteur.
Prenons le cas d'un "verdict" du genre de notre TP sur l'IMC (voir correction du TP3).
Dans ce cas, le switch s'écrirait ainsi :
<?php
switch
($corpulence
){
case
'denutrition'
:
$verdict
=
'Vous êtes en dénutrition.'
;
//placer ici un lien vers un centre d'aide aux troubles du comportement alimentaire
break
;
case
'maigre'
:
$verdict
=
'Vous êtes maigre.'
;
//placer ici quelques conseils d'hygiène de vie
//MANGEZ bougez
break
;
case
'normal'
:
$verdict
=
'Vous avez une corpulence normale.'
;
//placer ici quelques conseils "Continuez commme ça"
break
;
case
'surpoids'
:
$verdict
=
'Vous êtes en surpoids.'
;
//placer ici quelques conseils d'hygiène de vie
//BOUGEZ mangez
break
;
case
'obese_modere'
:
$verdict
=
'Vous êtes en état d
\'
obésité modérée.'
;
//placer ici quelques conseils d'hygiène de vie
//BOUGEZ BOUGEZ mangez
break
;
case
'obese_severe'
:
$verdict
=
'Vous êtes en état d
\'
obésité sévère.'
;
//placer ici quelques conseils d'hygiène de vie
//BOUGEZ BOUGEZ BOUGEZ REVOYEZ TOUT VOTRE MODE DE VIE
break
;
case
'obese-massive'
:
$verdict
=
'Vous êtes en état d
\'
obésité massive.'
;
//placer ici un lien vers un centre d'aide aux troubles du comportement alimentaire
}
?>
Et voici l'explication :
Dans le cas (case) où la variable $corpulence est égale à 'denutrition' : affecte telle 'formule' à la variable verdict et procède à telle série d'instructions, dans le case 'maigre' affecte telle autre valeur à $verdict etc. etc.
On sait que ces conditions s'excluent l'une l'autre grâce à l'instruction break; qui signifie : 'quand tu as finis, sors de ce switch'.
D'où la raison pour laquelle le dernier case 'obese_massive' ne nécessite pas de break, il pourrait en prendre un, mais disons que ça ne sert à rien, on est en fin de switch (accolade finale)...
Bien sûr, avant ce switch, il faudrait s'assurer que $corpulence, via des conditions, se voit bien affecter tout cet éventail de valeurs...
Bien sûr, après ce switch, il faudrait placer la suite des instructions, suite commune quelle que soit la valeur de $corpulence et/ou $verdict ...
<?php
echo '<h3>'
.
$verdict
.
'</h3><br/>'
;
echo '<p>Mais ne prenez pas ce constat, aussi brut soit-il, trop à coeur. <br/>
Une corpulence, s
\'
il en est besoin, peut changer grâce aux conseils ci-dessus.</br></br>
Ce n
\'
est qu
\'
une norme qui doit vous indiquer si votre hygiène de vie est à faire évoluer ou non.
<br/><br/>
Pas le verdict du tribunal d
\'
inquisition !.</p>'
;
?>
Nous y reviendrons dans la conclusion de ce tutoriel, mais le switch a ceci de très agréable que quand vous développerez des sites ou des applications un peu plus costaudes en PHP :
Il rendra votre code beaucoup plus lisible.
Vous pourrez caser des lignes et des lignes d'instructions à l'intérieur d'un case, au nom parlant, lui même à l'intérieur d'un switch($procedure) qui fait que l'on ne sera pas perdu en relisant votre code...
V-5. TP5▲
Dans fonctions.php, vous créerez une fonction qui, quand on lui passe un nombre, affiche le verdict "est un nombre premier" ou "n'est pas un nombre premier";
Pour rappel, un nombre premier est un nombre qui n'est divisible QUE par lui-même et par 1 (et ce, de façon distincte, donc 1 n'est pas un nombre premier).
A ce propos, 0 n'est pas un nombre premier non plus (car on ne peut pas le diviser par zéro), mais vous le gérerez comme une exception...
Dans premiers.php, vous proposerez un formulaire pour que l'utilisateur entre un nombre, disons entre 1 et 10 000, puis traiterez le nombre entré en appelant la fonction en cas de clic sur validation.
Vous afficherez alors le verdict sous la forme :
"99 n'est pas un nombre premier." ou bien "59 est un nombre premier" etc...
Si vous bloquez vraiment, après avoir cherché, lisez le préambule de la correction avant de vous replonger dans la réflexion... Cela devrait vous aider sans tout vous mâcher...
V-6. Correction du TP5▲
Petit préambule avant la correction (abondamment commentée) des deux fichiers :
Un flag (que l'on peut appeller $flag pour plus de lisibilité) est une variable logique qui fonctionne un peu comme un drapeau qui est en berne ($flag=0;) et se soulève à l'événement qu'on lui a indiqué ($flag=1;).
Ici, on souhaite que dès qu'il repère un multiple (un seul), hop, il initialise le flag à 1, et il sort de la boucle.
A ce propos, un autre tuyau : au sein d'une boucle, la commande break; permet de sortir sans finir les tours de boucle.
Le programme cesse de tester les autres multiples, c'est devenu superflu pour l'objectif que nous poursuivons, et qui est de chercher quand un nombre cesse d'avoir une chance d'être premier...
Veuillez cliquer sur le symbole à droite pour découvrir la solution quand vous aurez fini.