Leçons de niveau 15

SPARQL Protocol and RDF Query Language/Travail pratique/PHP les fonctions

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche
Début de la boite de navigation du travail pratique
Les fonctions
Image logo représentative de la faculté
T.P. no 11
Leçon : SPARQL Protocol and RDF Query Language

TP de niveau 15.

Précédent :PHP les boucles et opérateurs
Suivant :PHP avec MySQL
Icon falscher Titel.svg
En raison de limitations techniques, la typographie souhaitable du titre, « Travail pratique : Les fonctions
SPARQL Protocol and RDF Query Language/Travail pratique/PHP les fonctions
 », n'a pu être restituée correctement ci-dessus.


Introduction[modifier | modifier le wikicode]

Dans ce TP, nous allons acquérir quelques bases de programmation PHP pour utiliser des fonctions.

Ce TP a pour objectif de pouvoir utiliser des librairies de fonctions plus facilement par la suite.

À savoir avant de commencer[modifier | modifier le wikicode]

Les fonctions[modifier | modifier le wikicode]

Définition[modifier | modifier le wikicode]

Imaginons que le code suivant est utilisé dans plusieurs pages de votre site Web :

<?php
//Construisons un tableau de notes :
$notes=array(2,5,7,10,11,13,15,17,18);
echo 'Vos notes du trimestre :<br />';
foreach($notes as $note){
	echo '- '.$note.'<br />';
}
?>

Votre code affichera les notes d'un élève, mais on veut :

  • mettre en rouge toutes les notes (strictement) inférieures à 10.
  • 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.


Utilisation[modifier | modifier le wikicode]

Utilisation d'une fonction :

  • On place la fonction au début du code(au sein de balises PHP).
    • PHP ne parcourt qu'une seule fois le code. Si la fonction n’est pas définie avant son utilisation, PHP génère une erreur.
  • On ne la crée qu'une fois, tandis qu'on la convoque autant de fois que l’on veut.

Syntaxe[modifier | modifier le wikicode]

Voici la coquille de la fonction pour résoudre notre problème :

function colore($nombre){
	//toutes les instructions se situeront à l'intérieur de ces accolades;
	//et se termineront par un ;
}

Pour écrire une fonction :

  • il est obligatoire de commencer par écrire function,
  • ensuite vient le nom. On va lui donner un nom simple à retenir.
    • comme les variables, les noms de fonctions sont libres, il faut simplement bannir les espaces et les accents.
    • le nom de votre fonction est sensible à la casse, c'est-à-dire que vous devenez respecter les majuscules et les minuscules quand vous appelez votre fonction.
  • Et, entre parenthèses, le paramètre (une variable imaginaire, $nombre, dont on ne connaît pas encore la valeur)...


On fait, comme si $nombre existait déjà.
Voici un exemple de code qui effectue ce que l’on veut obtenir :

<?php
/**
 * Fonction qui affiche une note en couleur.
 */
function colore($nombre){
	if($nombre<10){
		echo'<font color="red">'.$nombre.'</font>';
	}elseif($nombre>=15){
		echo'<font color="green">'.$nombre.'</font>';
	} else{ //cas par défaut(noir)
		echo $nombre;
	}
}
?>

On peut maintenant appeler notre fonction dans une page Web :

<?php
//Construisons notre tableau de notes :
$notes=array(2,5,7,10,11,13,15,17,18);
//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 />';
}
?>

Voici notre page Web en entier avec la définition de notre fonction avant l'appel de la fonction dans le code :

<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>

Bien que votre fonction se définissait avec "colore($nombre)", vous pouvez l'appeler avec "colore($note)". Cela ne pose aucun problème. Le nom de la variable utilisée comme paramètre au sein de la fonction est celui que vous voulez.

Plusieurs paramètres[modifier | modifier le wikicode]

Les fonctions peuvent être définies avec plusieurs paramètres.

Par exemple, je peux définir une fonction "moyenne annuelle" :

<?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
?>

Valeur de retour[modifier | modifier le wikicode]

Si 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 indique si un nombre est pair ou impair.

Voici un formulaire de saisie et une analyse du nombre entré :

<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, 
		//on initialise les deux valeurs de verdict
		if (($nombre%2)==0){
			$verdict='pair';
		}else{
			$verdict='impair';
		}
		return $verdict; //on renvoie le verdict, tout à la fin
	}
	?>
	<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'])){ 
		$nombre=$_POST['num']; //récupère la valeur entrée
		$toto=parite($nombre); //place dans $toto la valeur de retour de ma fonction
		echo 'Ce nombre est '.$toto.'.'; //affiche le verdict entier
	}
	?>
	</body>
</html>

Le mot clé return :

  • stoppe la fonction
    • on peut le placer à tout moment dans la fonction, mais pour une meilleure lisibilité du code, il ne faut l’utiliser qu'une fois et comme dernière instruction de la fonction (juste avant l'accolade finale qui ferme la fonction)
  • ne peut renvoyer qu'une seule valeur
    • libre à vous de rendre cette valeur complexe comme un tableau ou un objet.

Penser à "ranger" la valeur retournée dans une variable de "réception".

Importer des fonctions[modifier | modifier le wikicode]

Si votre fonction est utilisée dans au moins deux pages Web, vous pouvez mettre vos fonctions dans un autre fichier et partager votre fonction dans plusieurs pages Web. Il vous suffit de convoquer le fichier une seule fois au tout début de chacune de vos pages PHP.

Avec une fonction include, vous pouvez insérer le code d'un autre fichier dans votre page :

<?php
include('fonctions.php');
?>

ou require, qui lève une erreur s'il ne trouve pas le fichier :

<?php
require('fonctions.php');
?>

ou require_once, qui lève une erreur s'il ne trouve pas le fichier, mais qui ne charge qu'une fois ce fichier. Cela évite de recharger inutilement ce fichier. si require_once est appelé plusieurs pour charger le même fichier.

<?php
require_once('fonctions.php');
?>

Ceci vous permet d'appeler n’importe quelle fonction définie dans votre fichier.


Par exemple, vous avez développé un site et vous souhaitez sur chacune des pages signaler votre dernier magazine. Vous pourriez créer la fonction suivante :

<?php
function DernierMag(){
	echo'Dernière parution mise à jour :<br />
	PIF GADGET<br />
	le 10/01/2009';
}
?>

Dans chacune des pages de votre site où vous souhaitez que le message apparaisse, vous devrez :

  • 1 ajouter la ligne suivante :
<?php
DernierMag();
?>
  • 2 ne pas oublier d'insérer "require_once('fonctions.php');" au début de votre page.


Cela vous permettra de mettre à jour toutes vos pages en modifiant une seule fois votre texte dans fonctions.php.


La commande switch[modifier | modifier le wikicode]

La commande switch gère les conditions multiples. Cela évite d’utiliser inutilement d'imbriquer les instructions if, elseif et else.

Exemple :

<?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
	break;
	
	Default :
		$verdict='Vous avez une corpulence normale.';
		//placer "Continuez comme ça"
	break;
}
?>

Traduction :

  • Dans le cas (case) où la variable $corpulence est égale à :
    • 'denutrition' alors affecter le texte 'Vous êtes en dénutrition.' à la variable $verdict
    • 'maigre' alors affecter une autre valeur à $verdict
    • une autre valeur que 'denutrition' ou 'maigre' alors les instructions dans le cas Default seront utilisées
  • On sait que ces conditions s'excluent l'une l'autre grâce à l'instruction break, qui signifie : 'quand tu as fini, sors de ce switch'.

Exercices[modifier | modifier le wikicode]

Lecture d'une liste depuis un formulaire[modifier | modifier le wikicode]

On veut qu’un utilisateur puisse mettre autant de mots-clés qu’il souhaite par expérience dans son CV.

  • Vous allez laisser un seul champ pour les mots clés de manière à pouvoir les écrire en les séparant par des espaces.
  • Utiliser la function explode($separateur,$text) pour convertir cette liste en un tableau.
  • Afficher les mots-clés dans le CV, séparés par des virgules, avec la fonction implode($glue,$arrayMotsCles) qui retourne du texte.
  • Si vous rencontrez un bug, afficher le contenu de votre variable avec :

echo print_r($mots_cles)

Gestion d'un formulaire dynamique[modifier | modifier le wikicode]

On veut qu’un utilisateur puisse indiquer autant d’expériences qu’il le souhaite

Il faut que PHP enregistre, dans des tableaux, les données de toutes les expériences envoyées par un formulaire.

  • Ajoutez [] (crochet ouvert puis crochet fermé, sans espace) à la fin du nom de tous les champs qui concernent une expérience dans le formulaire. PHP créera ainsi un tableau poste, date_debut, etc.
  • Recopiez dans ces champs votre formulaire pour permettre à l’utilisateur d’écrire trois expériences.
  • Dans un fichier fonctions.php, fabriquer la fonction afficheExperience($arrayExperience,$index) pour afficher une expérience.
  • Utiliser cette fonction pour afficher le CV.

Création du formulaire dynamique[modifier | modifier le wikicode]

Maintenant qu’on peut afficher n expériences dans un CV, on va faire en sorte que le fichier HTML puisse, à la demande de l’utilisateur, rajouter des expériences.

Insérer dans la page du formulaire le code suivant avant l’élément body :

<script type="text/javascript">
var nb_experience = 0;
function AjouteExperience() {
if(! document.getElementById && document.createElement) { return; }
var divExperiences = document.getElementById("experiences");
var nouvelleExperience = document.createElement("div");
nb_experience++;
nouvelleExperience.innerHTML = '<b>Expérience ' + nb_experience + ' : </b><br /> \
Date de début (aaaa-mm-jj) : <input type="text" name="date_debut[]"/> <br />\
Toujours en poste : <input type ="checkbox" name="poste_actuel[' + (nb_experience - 1) + ']" >ou \
Date de fin (aaaa-mm-jj) : <input type="text" name="date_fin[]"/> <br />\
Poste : <input type="text" name="poste[]"/> <br />\
Employeur : <input type="text" name="societe[]"/> <br />\
Description : <br /><textarea name="description[]" cols="50" rows="5"></textarea> <br /> \
Mots-clés : <input type="text" name="mots_cles[]"/> <br />';
   divExperiences.appendChild(nouvelleExperience);
} // function AjouteExperience()
</script>

Pour indiquer la zone "où insérer les champs pour décrire son expérience et le bouton insérer", on remplace les précédents champs de texte par le code suivant :

Expériences professionnelles : <br />

<input type="button" value="Ajouter une expérience" onClick="AjouteExperience();" />