<html>
<body>
<?php
// afficher un menu de login membre simple
echo '
<table>
<form action="liens.php" method="post" name="login_form">
<tr>
<td>Votre login</td>
<td><input type="text" name="login" value="" size="20" maxlength="42"></td>
</tr>
<tr>
<td>Votre password</td>
<td><input type="password" name="pass" value="" size="20" maxlenght="12"></td>
</tr>
<tr>
<td>
<input type="submit" name="valider" value="val">
<input type="reset" name="annuler" value="anu">
</td>
</tr>
</form>
</table> ';
?>
</body>
</html>
<?php
/*
** Function : form_login_member
** Input : aucun pour l'instant
** Output : aucun
** Description : affichage d'un formulaire de login de membre
** Creator : polom
** Date : 25/10/2001
*/
function form_login_member()
{
echo '<table>';
echo '<form action="liens.php" method="post" name="login_form">';
echo '<tr>';
echo '<td>Votre login</td>';
echo '<td><input type="text" name="login" value="" size="20" maxlength="42"></td>';
echo '</tr>';
echo '<tr>';
echo '<td>Votre password</td>';
echo '<td><input type="password" name="pass" size="20" maxlenght="12"></td>';
echo '</tr>';
echo '<tr>';
echo "<td>;
echo '<input type="submit" name="valider" value="val">';
echo '<input type="reset" name="annuler" value="anu">';
echo '</td>';
echo '</tr>';
echo '</form>';
echo '</table>';
}
?>
3 - Utiliser cette fonction dans le code précédent vu en 1 :
Plusieurs possibilités s'offrent à vous pour utiliser cette fonction à la place du code dans index.php, je vous propose deux possibilités pour intégrer cette fonction, sachant que la deuxième est préférable.
Déclarer la fonction au début du fichier index.php, elle sera appelée ensuite dans le script.
Créer un fichier qui regroupera vos fonctions ce qui permet de les retrouver facilement, vous ferez appel à ce fichier à l'aide de include ("fonctions.inc.php") ou require ("fonctions.inc.php") si votre fichier de fonctions s’appelle fonctions.inc.php bien sur
toujours avant de faire appel à la fonction dans index.php
4 - le nouvel index.php avec la fonction :
Nous allons opter pour la deuxième solution, cad mettre notre fonction dans le fichier fonctions.inc.php, je ne mettrai pas le code, c'est le même que précédemment
, et faire appel à la fonction dans notre fichier index.php
<html>
<body>
<?php
include ("fonctions.inc.php");
form_login_member();
?>
</body>
</html>
<html>
<body>
<?php
include ("fonctions.inc.php");
$action = "ma_page_de_validation.php";
$login_def = "Ici votre login";
$sub_name = "Envoyer";
$reset_name = "Annuler la saisie";
$login_txt = "Votre login :";
$pass_txt = "Votre password :";
form_login_member($action, $login_def, $sub_name, $reset_name, $login_txt, $pass_txt);
?>
</body>
</html>
Et voila vous avez une belle fonction qui affiche un formulaire de login paramétrable propre et clair. Rien ne vous empêche de modifier vous-même maintenant cette fonction pour la faire évoluer
vous pouvez par exemple passer les tailles des boutons, des champs etc...
Ps : Vous pouvez bien sûr appeler des fonctions à l'intérieur d'autres fonctions.
Ps2 : Il n'est pas obligatoire de nommer les variables passées dans la déclaration de la fonction de la même façon que celles passées dans le script principal, cependant cela demeure plus clair d'utiliser les mêmes noms de variables dans les 2 cas.
Ps3 : Vous pouvez affecter des valeurs par défaut aux paramètres en les déclarant comme ceci : function toto($nbr, $nbr2 = "42") et la si vous ne précisez pas le paramètre $nbr2 il sera mis à 42 par défaut. Ceci est valable uniquement pour les variables passées par valeur (voir ci-dessous).
6 . Paramètres par valeur ou par référence
Les paramètres d'une fonction peuvent être passés de deux façons différentes :
Par valeur, c'est a dire que s'ils ont une valeur à l'extérieur de la fonction, seule la valeur est transmise à la fonction, si la variable subit des modifications à l'intérieur de la fonction, ces modifications ne seront pas perçues dans le programme principal.
Par référence, avec le signe & avant la variable (ex : &$cpt). Dans ce cas-là, l'adresse mémoire de la variable dans le programme est passée à la fonction et toute modification de cette variable dans la fonction aura des répercutions à l'extérieur du programme.
Voici un exemple de programme utilisant une fonction avec un passage par valeur et ensuite par référence :
<?php
function modif_tab($tab)
{
$tab[0] = "j'aime le perl mais je préfere le php.";
}
?>
<html>
<body>
<?php
$tab = array("salut", "j'aime le fortran et le cobol");
// passage de $tab par valeur, la boucle for affichera
// salut, j'aime le fortran et le cobol
modif_tab($tab);
for ($i = 0; $tab[$i]; $i++)
echo "$tab[$i] ";
// passage de $tab par référence, la boucle for affichera
// salut, j'aime le perl mais je préfere le php.
modif_tab(&$tab);
for ($i = 0; $tab[$i]; $i++)
echo $tab[$i] ;
?>
</body>
</html>
Voilà j'espère que vous avez compris la nuance entre les deux types de passage
7 . Retourner des valeurs dans une fonction
Nous allons utiliser un exemple d'operations sur 2 nombres : addition, multiplication, division par exemple toujours dans un fichier index.php. Le résultat de l'opération entre ces 2 nombres sera calculé dans la fonction puis retourné à l'aide de l'instruction return($result) (NB: une fois arrivé à l'instruction return, tout traitement qui suit est arreté).
1 - le programme dans index.php qui fait appel à la fonction :
<html>
<body>
<?php
include ("functions.inc");
// operations "add", "sou" "mul"
$operation = "add";
$nbr1 = 42;
$nbr2 = 69;
$result = 0;
// recuperation du resultat de 42 + 69
$result = do_op($nbr1, $nbr2, $operation);
// affichage du resultat;
echo $result;
// affiche 111
?>
</body>
</html>
Donc ici nous initialisons les 2 nombres ainsi que l'opération à effecuter, puis on fait appel à la fonction do_op contenue dans le fichier inclus dans fonctions.inc.php
2 - La fonction qui effectue les opérations :
<?php
/*
** Function : do_op
** Input : INT nbr1, INT nbr2, STRING operation
** Output : INT result
** Description : effectue une opération addition, multiplication ou division
** Creator : polom
** Date : 25/10/2001
*/
function do_op($nbr1, $nbr2, $operation)
{
if ($operation == "add")
return ($nbr1 + $nbr2);
else if ($operations == "mul")
return ($nbr1 * $nbr2);
else if ($operations == "div")
return ($nbr1 / $nbr2);
return (NULL);
}
?>
La fonction reçoit donc les 2 nombres et l'opération à faire, elle retourne le résultat une fois l'opération faite.
Vous pouvez aussi ne pas retourner directement le résultat dans la fonction précédente et le stocker, puis le retourner à la fin de la fonction. Sachez que une seule valeur peut être retournée dans une fonction, si vous voulez retourner plusieurs valeurs, il faut à ce moment là utiliser un tableau ou des variables globales (voir ci-dessous).
<html>
<body>
<?php
function stat_fonc()
{
static $cpt = 0;
$cpt++;
echo $cpt;
}
stat_fonc();
// affiche 1 c'est-à-dire premier appel à la fonction, $cpt est initialisé à 0 une seule fois
// et incrementé de 1
stat_fonc();
// affiche 2, $cpt a gardé la valeur précédente et l'incrémente de 1.
?>
</body>
</html>
?>
9 . Récursivité
Qu'est ce que la récursivité ? La récursivité est le fait d'une fonction qui se rappelle elle-même au moins une fois jusqu'à atteindre un résultat voulu. Prenons un exemple simple pour expliquer ce principe à travers le calcul de la puissance d'un nombre entier.
1 - Le code dans index.php :
<html>
<body>
<?php
$nbr = 2;
$puissance = 4;
$result = puissance($nbr, $puissance);
echo $result;
?>
</body>
</html>
On affiche donc ici le résultat de 2 à la puissance 4 c'est à dire 16.
2 - la fonction normale sans récursion :
<?php
/*
** Function : puissance
** Input : INT nbr, INT puissance
** Output : INT result
** Description : effectue la puissance d'un nombre entier
** Creator : polom
** Date : 25/10/2001
*/
function puissance ($nbr, $puissance)
{
for ($total = $nbr; $puissance > 1; $puissance--)
$total = $total * $nbr;
return ($total);
}
?>
Donc là rien de bien compliqué on initialise le résultat au nombre
donc si on a par exemple 2 puissance 4 on a la trace suivante (une trace est l'état de vos variables tout le long de votre programme, c'est une méthode intéressante pour suivre l'évolution de vos variables et débuger entre autre) :
-> départ $total = 2;
4 > 1 ok
$total = 4;
3 > 1 ok
$total = 8;
2 > 1 ok
$total = 16;
1 n'est pas > à 1 donc on arrète le traitement
-> fin $resultat = 16