Cpm Affiliation : la régie publicitaire au Cpm

Les fonctions

Je dois vous l'avouer, j'attendais ce chapitre depuis longtemps. En effet, dans ce chapitre, je vais vous expliquer un élément dont on s'est beaucoup servi, mais dont vous ignorez le fonctionnement : var_dump(). Comme vous devez vous en doutez vu le titre du chapitre, var_dump() est ce qu'on appelle une fonction.

Première approche

On va commencer, comme à notre habitude, par une petite histoire.

Quand vous êtes de gentils petits garçons (ou de gentilles petites filles, pas de discrimination), il peut arriver que vous demandiez à votre maman de vous éplucher une pomme. Si elle voit votre grand sourire, elle dira oui, ira chercher une pomme, l'épluchera, la coupera et vous la servira sur une petite assiette.
En ne faisant que dire : « Tu peux m'éplucher une pomme ? », vous avez fait exécuter plusieurs actions à votre maman.
C'est le principe même d'une fonction.
Allons plus loin et demandons maintenant à maman si elle peut nous éplucher une orange. Elle va faire la même chose, à savoir : dire oui, aller chercher l'orange, l'éplucher, la couper et la servir sur une assiette.

En résumé, si vous dites : « Tu peux m'éplucher une pomme ? », votre mère exécute toutes les actions (prendre, éplucher, couper et servir) sur la pomme.
Si vous dites : « Tu peux m'éplucher une orange ? », elle fera les mêmes actions, mais sur une orange.

Une fonction est caractérisée par trois choses : son nom, ses paramètres et sa valeur de retour.
Si l'on applique ça à l'exemple précédent, le nom est « Tu peux m'éplucher », le paramètre est « une pomme » (ou « une orange ») et la valeur de retour est la pomme ou l'orange découpée servie sur une petite assiette.

Beaucoup d'appareils que vous utilisez tous les jours ont ce genre de fonction, par exemple une friteuse. La seule chose qu'on change, c'est la température à laquelle on veut chauffer la graisse et la friteuse fait le reste en fonction de ça.

Imaginez que vous ayez cinquante variables et que vous deviez calculer le volume de la sphère de rayon égal à la valeur de la variable. Il existe une formule, vous pourriez faire cinquante fois le calcul, un calcul par variable. Mais ça serait très long à écrire. Tandis que si vous faisiez une fonction, vous taperiez une fois la formule, puis il vous suffirait de taper le nom de la fonction avec les variables (qui seront les paramètres) et la fonction vous retournerait le volume de la sphère.

Pour résumé, une fonction est une structure, un objet auquel vous données des entrées sur lesquels elle travaille pour vous donner une sortie, comme illustré à la figure 8.1

 

fonctions

 

Votre première fonction

Maintenant que vous savez quel est le but des fonctions, on va en créer une, voici le code :

Code PHP :

<?php

function volumeSphere($rayon)
{
return (4 * 3.14 * $rayon * $rayon * $rayon) / 3;
}

 

On va étudier ce code, mais d'abord le simplifier :

Code PHP :

<?php

function NAME($PARAM)
{
// bloc d'instructions
return Expression;
}

Voilà le code minimal pour créer une fonction (je mens, vous comprendrez après pourquoi).
Tout d'abord, il y a le mot-clé function, il indique au PHP qu'on veut déclarer une fonction (à ne pas confondre avec une déclaration de variable). Vient ensuite le nom de la fonction, ici NAME, c'est avec ce nom que vous appellerez la fonction par la suite.
Entre les parenthèses, vous trouvez $PARAM, c'est une variable, c'est un paramètre (une information dont la fonction a besoin pour faire son job).
On trouve aussi des accolades, comme pour les structures de contrôle ; et un dernier mot-clé subsiste : return. Ce mot-clé indique quelle expression la fonction doit retourner.
Si on l'applique à l'exemple de départ, on aurait une fonction du genre :

Code PHP :

<?php

function tuPeuxMeplucher($type)
{
return couper(eplucher(prendre($type)));
}

INFORMATION : couper(), eplucher() et prendre() sont également des fonctions ; en effet, on peut appeler des fonctions à l'intérieur même d'une fonction.

Pour appeler cette fonction et donc recevoir un fruit, on aurait un code du style :

Code PHP :

<?php

$fruit = 'Une pomme';
var_dump(tuPeuxMeplucher($fruit));

ATTENTION : Bien évidemment, ne testez pas ces codes, ils ne sont pas fonctionnels.

Revoilà notre var_dump()… il va nous servir. C'est une fonction. Souvenez-vous de ce que j'ai dit sur son utilisation : j'ai dit qu'il fallait mettre une expression entre les parenthèses pour afficher le type et la valeur de l'expression.
Ce qui sous-entend que… ? Eh oui, une fonction peut être une expression. Souvenez-vous de ce qu'est une expression, quelque chose qui possède une valeur. Une fonction retourne une expression, or une expression est une valeur : une fonction retourne donc une valeur. Et comme la fonction retourne une valeur, elle possède forcément une valeur, ce qui implique que c'est une expression (je vous conseille de relire deux ou trois fois cette phrase, soyez sûr de la comprendre).

J'ai dit que je vous mentais : c'est vrai. Le mot-clé return qui indique quelle expression doit retourner la fonction n'est pas indispensable. On peut l'enlever, la fonction ne retournera donc rien et ce ne sera donc pas une expression. Si toutefois vous tentez de l'utiliser comme une expression, par exemple dans une addition, l'interpréteur PHP agira de la même façon qu'avec une variable qui n'existe pas et considèrera que la fonction retourne null.
En général, on utilise davantage de fonctions qui retournent des valeurs, mais il existe des tas de fonctions qui n'en retournent pas — un exemple que vous connaissez bien est var_dump(). Essayez donc de faire un var_dump() d'un var_dump() pour voir.

Code PHP :

<?php

var_dump(var_dump(1));

var_dump(1) affiche « int(1) », c'est son rôle, mais ne retourne rien comme je vous l'ai dit. Et donc le var_dump() englobant nous affiche un triste et solitaire null.

Souvenir, souvenir

Si vous n'avez pas bien compris le concept d'expression et d'opérateur, c'est maintenant que vous allez le sentir.
On a vu qu'une fonction pouvait être une expression, on peut donc assigner cette expression à une variable grâce à l'opérateur d'affectation.

Petit exemple avec la fonction du volume d'une sphère :

Code PHP :

<?php

// on déclare la fonction, elle ne fait rien, l'interpréteur PHP va juste savoir qu'elle existe
function volumeSphere($rayon)
{
return (4 * 3.14 * $rayon * $rayon * $rayon) / 3;
}
// on choisit un rayon arbitrairement
$diametre = 5;
// on calcule le volume (on a besoin du rayon comme paramètre ; or, le rayon est égal au demi-diamètre)
$volume = volumeSphere($diametre/2);
var_dump($volume);

Ce code vous affichera le volume d'une sphère de rayon 2.5.
Il est évidemment inutile d'utiliser une variable pour rien ($volume) dans ce genre de cas ; il suffit de mettre la fonction directement dans le var_dump() comme ceci :

Code PHP :

<?php

$diametre = 5;
var_dump(volumeSphere($diametre/2));

Les deux codes reviennent strictement au même si vous n'avez plus besoin du volume par la suite, mais le second est meilleur car on ne crée pas de variable inutilement.

Il peut arriver que votre fonction ait besoin de plusieurs paramètres, par exemple une fonction qui calculerait l'aire d'un rectangle (l'aire est égale à la longueur multipliée par la largeur). Si vous avez besoin de plusieurs paramètres, il suffit de les séparer par une virgule tant dans la déclaration de la fonction que dans son utilisation. Exemple :

Code PHP :

<?php

function aireRectangle($largeur, $hauteur)
{
// on peut faire ainsi :
$aire = $largeur*$hauteur;
return $aire;
/*
// Mais aussi ainsi (et c'est même recommandé, car il y a moins d'instructions et de variables inutiles) :
return $largeur*$hauteur;
// D'ailleurs, vous devriez y avoir pensé quand j'ai dit que return retournait la valeur de l'expression
*/
}

var_dump(aireRectangle(5, 4)); // l'aire doit être égale à 20, testez donc

Il y a un troisième cas qui peut se présenter, celui où la fonction possède des paramètres facultatifs, c'est-à-dire qui ne sont pas indispensables. Reprenons l'exemple de la sphère :

Code PHP :

<?php

function volumeSphere($rayon = 5)
{
return (4 * 3.14 * $rayon * $rayon * $rayon) / 3;
}

var_dump(volumeSphere());
var_dump(volumeSphere(10));
var_dump(volumeSphere());

Ce code va vous afficher les trois volumes, le premier et le troisième étant les mêmes.
Vous le voyez, la différence est claire : dans le premier et le troisième appel de la fonction, on ne donne pas le rayon de la sphère, car j'ai rendu ce paramètre facultatif.
Regardez la déclaration de la fonction : au lieu d'avoir juste $rayon, j'ai mis $rayon = 5. En faisant ça, je donne une valeur par défaut à cette variable. Si je ne donne pas de valeur pour ce paramètre, l'interpréteur PHP utilisera celui par défaut (ce qui explique pourquoi le premier et le dernier appel de la fonction renvoient la même valeur).

Attention, cependant. Quand votre fonction possède plusieurs paramètres mais que vous ne voulez pas les rendre tous facultatifs, vous devez mettre les paramètres facultatifs le plus à droite possible dans la déclaration de la fonction.

Code PHP :

<?php

// MAUVAIS
function aireRectangle($largeur = 10, $hauteur)
{
return $largeur*$hauteur;
}
// correct
function aireRectangle($hauteur, $largeur = 10)
{
return $largeur*$hauteur;
}

Mais pourquoi ?
Réfléchissez. Comment appelleriez-vous la première fonction en utilisant son paramètre facultatif ?

Code PHP :

<?php

aireRectangle(, 5); // ainsi ? Incorrect
aireRectangle(5); // ainsi ? Incorrect (là, en réalité, vous donnez le paramètre $largeur mais pas $hauteur)

Avec la seconde fonction, plus de problème :

Code PHP :

<?php

aireRectangle(5); // OK, on renseigne juste la hauteur, et la largeur utilisée est celle par défaut
aireRectangle(5, 90); // on renseigne la hauteur et la largeur


INFORMATION : Les noms de vos fonctions subissent la même règle que les noms des variables : « ils commencent par un underscore ou un caractère alphabétique, puis n'importe quel caractère alphanumérique ou un underscore ».

ATTENTION : Les valeurs par défaut que vous donnez à vos fonctions doivent être des constantes, vous ne pouvez pas donner une variable ou le résultat d'une fonction comme valeur par défaut à un argument d'une fonction.

Les fonctions, c'est trop fort !

Vous avez eu un avant-goût : maintenant, on passe à table.
Plusieurs petites choses sympas sont possibles avec les fonctions comme les fonctions « héritables » et les fonctions récursives. Mais commençons d'abord par les fonctions conditionnelles.

Lorsque l'interpréteur PHP va interpréter votre code, il va commencer par analyser sa syntaxe. S'il y a une erreur, il vous l'indique. Après cette analyse, l'interpréteur PHP va enregistrer temporairement toutes les fonctions que vous aurez créées avant même que votre script ne commence réellement à être exécuté. C'est pour ça que vous pouvez utiliser une fonction dans votre code avant qu'elle ne soit déclarée ; exemple :

Code PHP :

<?php

lala();

function lala()
{
var_dump('lala');
/*
** Cette fonction affiche quelque chose à l'écran
** Mais ce n'est pas une expression
** Comme il n'y a pas de return, il n'y a pas de valeur de retour
** Appeler la fonction n'apporte pas de valeur
** Et comme ce qui n'a pas de valeur n'est pas une expression…
*/
}

Maintenant, que se passe-t-il si je mets ceci ?

Code PHP :

<?php

if(Expression)
{
function lala()
{
var_dump('lala');
}
}

lala();

Mettez donc d'abord true comme expression dans le if, et puis false. Vous constaterez qu'en fonction de ça, vous aurez soit String(4) "lala" qui s'affiche, soit une erreur incompréhensible (pour le moment, du moins).
Quand je dis que l'interpréteur PHP enregistre toutes les fonctions avant même que le script ne commence à être exécuté, ce n'est pas tout à fait vrai. L'interpréteur PHP enregistre toutes les fonctions qui sont en dehors d'un bloc d'instructions (en dehors d'un if, d'un else, d'un for, d'un while, d'une… fonction !). Si j'avais appelé la fonction avant le if, ça aurait toujours retourné une erreur ; en effet, la fonction n'est déclarée qu'après que le if a été interprété. Si vous appelez la fonction avant qu'elle ne soit déclarée, pan : une erreur.
Vous devez donc bien prendre garde quand vous utilisez des fonctions dans des structures de contrôle.

Et voici le second jouet : une fonction dans une fonction. Un petit code :

Code PHP :

<?php

function a()
{
function b()
{
var_dump(0);
}
}

b();

Un erreur ? Mais comment est-ce possible ?
C'est très simple : la fonction b() est déclarée dans une autre fonction, ce qui implique que tant qu'on n'a pas appelé la fonction dans laquelle elle est déclarée, la fonction n'existe tout simplement pas.
Le code correct serait donc :

Code PHP :

<?php
function a()
{
function b()
{
var_dump(0);
}
}

a(); // la fonction a() est exécutée, la fonction b() est donc déclarée
b();
?>

Vous voyez, rien de magique dans le PHP, tout est logique (ou presque, mais bon). Quand vous utilisez cela, faites attention à ne pas utiliser de fonction non déclarée.

Le numéro trois : les fonctions récursives. Ce genre de fonction est plus ou moins souvent utilisées en fonction de ce qu'on fait, ce sont des fonctions qui peuvent s'appeler elles-mêmes au besoin.
Un exemple :

Code PHP :

<?php

function lala($chiffre)
{
if($chiffre < 5)
{
var_dump('Fin');
}
else
{
var_dump('Continue');
lala(--$chiffre);
}
}

lala(11);
lala(4);

Courage, plus que quelques lignes et ce sera fini !

L'avant-dernière chose dont on doit parler, ce sont les fonctions variables.
Pour l'instant, on appelait toujours nos fonctions de cette façon :

<?php

nomFonction($parametre);

?>

Mais on peut le faire autrement…

<?php

$nom = 'nomFonction';
$nom($parametre);

?>

Le résultat sera strictement identique. Quand vous mettez des parenthèses à la droite du nom d'une variable, l'interpréteur PHP va appeler la fonction dont le nom est égal à la valeur de la variable (après avoir converti la valeur en chaîne de caractères au besoin). Ça peut être pratique dans certains cas, on en rencontrera sans doute, et de toute façon vous devez le savoir au cas où vous rencontreriez un script qui utilise cela.

Allez pour le plaisir, dernier point : la portée des variables. Je ne vais pas tout vous expliquer, ça serait un peu long. Souvenez-vous de la figure 8.1, j'ai schématisé la fonction par une usine, parce que c'est un assez bon comparatif. Une fonction, toute comme un usine est un peu comme une boîte noire : on sait ce qui y rentre, on sait ce qui en sort, mais on ne sait pas du tout ce qu'il s'y passe, l'usine est un monde à part sans aucun rapport avec le notre. En PHP c'est pareil, vous devez voir vos fonctions comme des petites usines qui font un certain travail et que vous utilisez mais dont vous ignorez le fonctionnement. Prenez par exemple var_dump() : vous savez ce que vous lui donnez, vous savez ce qu'elle produit, mais vous ne savez pas comment elle le fait. D'ailleurs, qui s'en soucie ? Le propre d'une fonction, son but, c'est d'assurer un rôle, de faire quelque chose de particulier sans que l'utilisateur ne se soucie ni du comment ni du pourquoi. Cela a une conséquence direct sur votre code : n'essayez jamais d'utiliser une variable définie hors d'une fonction dans la fonction, ou inversement (donc, utiliser une variable définie dans une fonction hors de la définition du bloc de code de cette fonction). Sans quoi vous aurez droit à de belles erreurs.
La raison tient dans cette idée de monde à part : puisque la fonction — l'usine — est dans un monde à part, elle ne connait pas les variables qui sont en dehors d'elle-même, ces variables n'existent pas pour elle. Le raisonnement inverse est le même : puisque la fonction est dans un monde à part, les variables en son sein ne sont pas connues de votre script puisqu'elle n'existe tout simplement pas.
Nous reviendrons sur cette notion de portée des variables par la suite, ne vous en faites pas.

Si vous rencontrez une erreur de ce type :

Code console :

Fatal error: Call to undefined function meuh() in C:\www\test.php on line 32

C'est que vous employez une fonction qui n'existe pas : vérifiez bien le nom que vous avez tapé.

Voilà un chapitre attendu qui doit vous avoir ramolli la tête : n'hésitez surtout pas à le relire, les fonctions tiennent une place très importante dans le PHP (et dans bon nombre de langages de programmation) !

 

 



 

 


 


 

Infos Plan Partenaires
À propos Webmasters
C.G.U Services Gratuits Annuaire de sites web
Bannières Forum Ionoa

 

Aipoweb est un site édité par ASMOH NetWork  ©

Créer un site gratuit avec e-monsite - Signaler un contenu illicite sur ce site

×