formateur informatique

Créer et exploiter des fonctions en PHP

Accueil  >  Technique  >  Php  >  Php Débutant  >  Créer et exploiter des fonctions en PHP
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux, voici son url absolue :

Pour l'intégrer sur votre site internet ou blog, vous pouvez l'embarquer :

Sujets et formations similaires :


Les fonctions de programmation en PHP

Dans cette formation Php, nous poursuivons l'apprentissage des bases du langage par la présentation des fonctions. L'intérêt d'une fonction est de réaliser un traitement indépendant selon des données qui lui sont transmises. A l'issue, elle doit retourner une valeur. Cette valeur peut être le fruit d'un calcul. La création d'une fonction est justifiée lorsque le traitement concerné doit être réalisé régulièrement. Plutôt que de le coder à chaque fois, il est préférable de centraliser ses instructions dans une fonction. Le code général de la page Web est ainsi mieux structuré et plus clair.

Outre les fonctions que nous pouvons créer, tout langage propose déjà une importante bibliothèque de fonctions intégrées. Faut-il encore les connaitre. Les unes réalisent des traitements numériques tandis que les autres effectuent des traitements textuels.



Sources et présentation de la problématique
Pour découvrir les fonctions, leur construction et leur syntaxe, nous proposons d'améliorer les travaux que nous avions réalisés lors de la formation précédente sur les traitements itératifs.

Traitements récursifs bornés en PHP sur réception de valeurs transmises par le client en Javascript

Cette dernière avait donc pour objectif de présenter les traitements récursifs par les boucles. A ce titre, nous réceptionnions la valeur numérique transmise par l'internaute pour fournir sa table de multiplication par traitement itératif. Mais nous n'étions pas en mesure de tester si la donnée saisie était bien un nombre. Nous proposons donc de créer une fonction Php capable de tester l'information saisie. La décompression conduit au fichier de la page Web principale, nommé index.php et situé à la racine. Il est accompagné de ses ressources externes dont la feuille de styles CSS placée dans le sous dossier styles. Ajouter projet Internet dans émulateur Easy PHP

Nous obtenons la page Web interprétée par le navigateur. Il s'agit bien de la petite application que nous avions développée. Et pour preuve :
  • Taper une valeur numérique dans la zone de saisie,
  • Cliquer sur le bouton Envoyer pour soumettre le formulaire et transmettre la donnée,
D'une part la donnée est bien réceptionnée côté serveur et d'autre part elle est exploitée par traitement itératif. Il en résulte la table de multiplication pour le chiffre 5, sans dépasser la borne indiquée par l'internaute.
  • Taper désormais un texte puis cliquer sur le bouton Envoyer,
Valeur numérique attendue, exception sur texte non gérée en PHP

Notre code serveur est incapable de se déclencher ce qui paraît logique. En revanche et c'est plus grave, aucune indication n'est fournie à l'internaute en retour. Cette indication devrait par exemple l'inciter à corriger sa saisie.
  • A la racine du dossier de décompression, cliquer avec le bouton droit de la souris sur le fichier index.php,
  • Dans le menu contextuel, choisir de l'ouvrir avec un éditeur tel que le Notepad++,
Entre les lignes 43 et 47 pour un éditeur Notepad, vous notez la présence du formulaire encapsulant les contrôles Html, dont la zone de saisie et le bouton.

<form id='formulaire' name='formulaire' method='post' action='index.php'>
<div style='height:30px;width:100%;font-size:14px;'><strong>Valeur seuille :</strong></div>
<div style='height:30px;width:100%;'>
<input type='text' id='plafond' name='plafond' value='Saisir un nb entier' onclick='this.value=vider(this.value);'/></div>
<div style='height:40px;width:100%;'><input type='button' value='Envoyer' onClick='document.getElementById('formulaire').submit();'/></div>
</form>
...


De fait, lorsqu'il est soumis au clic sur le bouton Envoyer, un PostBack est généré. C'est l'instruction Javascript : document.getElementById('formulaire').submit(); qui réalise cette soumission. Un PostBack consiste en un aller-retour serveur de manière à transférer les données du formulaire. Ce sont les notions que nous avons apprises et mises en pratique lors des trois formations précédentes. C'est pourquoi nous les considérons comme acquises et les restituons.

A partir de la ligne 71, vous notez la section de code PHP délimitée par ses balises.

<?php
if(isset($_POST['plafond']))
{
$le_plafond = $_POST['plafond'];
$restitution = 'La table de multiplication pour le chiffre 5 :<br/>';

$i=0;

while($i<$le_plafond)
{
$restitution.= $i.'*5 = <span style='color:#CC3300;'>'.$i*5;
$restitution.= '</span><br />';
$i++;
}
}
else
{
$le_plafond = 0;
$restitution = '';
}
?>


L'instruction Php POST permet de tester la valeur transmise depuis le client, reconnue par le nom du contrôle Html (plafond).

Si le test est concluant, la boucle est enclenchée. Nous avons conservé la boucle while ici. Nous avions aussi présenté la boucle for. Cette boucle while réalise un traitement itératif tant qu'une condition est remplie. Ce critère est posé sur une variable numérique initialisée juste avant ($i=0;). Tant que sa valeur n'a pas atteint celle transmise par l'internaute, la boucle se poursuit en incrémentant la variable de boucle à chaque passage. Et cette valeur incrémentée est exploitée pour construire chaque ligne de la table de multiplication ($i*5).

Enfin, tout en bas de la page Html, figure un dernier code Php.

...
</script>

<?php
if(isset($_POST['plafond']))
{
?>
<script type='text/javascript' language='javascript'>
document.getElementById('plafond').value = '<?php echo$ le_plafond ?>';
</script>
<?php
}
?>

</html>


Il s'agit plus précisément d'un assemblage de code client et de code serveur. Il consiste à transmettre la donnée dans l'autre sens, du serveur vers le client. Nous la restituons ainsi dans la zone de saisie d'origine. Un PostBack réinitialise en effet la page Web. Et en ce sens, il vide tous les contrôles de formulaire. Nous avions mis en oeuvre cette technique dans la deuxième formation pour présenter les instructions conditionnelles.



Créer une fonction en PHP
Une fonction Php se déclare par le mot clé function suivi de son nom et entre parenthèses de ses paramètres. On parle de la signature de la fonction. Ces paramètres sont les données dont elle a besoin pour réaliser le traitement ou le calcul. Quand nous l'appellerons, nous devrons respecter cette signature. Son traitement est borné entre ses accolades, comme pour une boucle ou une instruction conditionnelle.

Notre fonction doit tester si la valeur transmise est bien numérique, celle issue du client. Elle ne requiert donc qu'un seul paramètre, une variable. On parle aussi d'argument.
  • Tout en bas de l'éditeur de code, à la suite des dernières instructions Php, créer la fonction test_nb comme suit :
...
</script>
<?php
}

function test_nb($transmis)
{
$val_ok = '0123456789.';
$nb = true; $nb_reel=false;
$nb_car=0; $indice; $caractere='';

$transmis=str_replace(',', '.', str_replace('','',$transmis));

return $transmis;
}


?>

</html>


A ce stade, notre fonction se contente simplement de purger les potentiels espaces et de remplacer la potentielle virgule par un point. Chez les anglo-saxons, la décimale est en effet matérialisée par le point et non la virgule. Et comme nous l'avons annoncé en préambule de cette formation, nous exploitons une fonction existante de Php, la fonction str_replace. Nous aurions pu la construire nous-même. Elle requiert trois paramètres qui sont dans l'ordre : L'occurrence à remplacer, l'occurrence de remplacement et la chaîne dans laquelle ce remplacement doit être effectué. Avec cette imbrication des deux fonctions str_Replace, nous remplaçons les deux occurrences à la volée. Cette fonction a la capacité de remplacer l'occurrence autant de fois qu'elle est trouvée. En Javascript, nous avions dû exploiter les expressions régulières car sa fonction ne remplace que la première des occurrences trouvées.

Nous avons déclaré plusieurs variables qui seront utiles lorsque que nous poursuivrons le développement de cette fonction. $val_ok énumère tous les caractères autorisés dans une donnée numérique. Nous devrons comparer chacun de ceux de la valeur transmise pour savoir s'ils se trouvent tous dans cette chaîne. Les deux booléens nb et nb_reel permettront de retourner l'indication avec précision : donnée numérique entière ou réelle.

Il s'agira d'initier une boucle sur la longueur de la chaîne transmise, d'où l'intérêt de la variable nb_car que nous affecterons ultérieurement. Le compteur de cette boucle sera matérialisé à chaque passage par la variable indice. Et à chaque passage, il faudra prélever le caractère suivant pour le chercher dans la chaîne des valeurs numériques autorisées, d'où l'intérêt de la variable caractere.

Une fonction Php renvoie à l'appelant le résultat de son traitement grâce à l'instruction return, suivie de la variable ayant subi les calculs ou modifications, soit la variable $transmis.

Pour tester cette fonction, faut-il encore qu'elle soit appelée.
  • Dans le calque Html, au-dessus de l'instruction echo $restitution située en ligne 102, ajouter la ligne suivante, inscrite en gras :
...
<?php
if(isset($_POST['plafond']))
{
?>
<h2>Traitement itératif sur : <?php echo $le_plafond; ?> passage(s)</h2>
<br /><div style='width:auto; text-align:left; font-size:18px; padding-left:30%;'>
La valeur transmise est <strong>: <?php echo test_nb($le_plafond); ?></strong><br />
<?php echo $restitution; ?>
</div><br />
<?php
}
?>
</div>
...


Nous passons ainsi la valeur à tester à notre fonction qui retourne instantanément son résultat. Et ce retour, nous l'affichons grâce à la fonction Php echo, par concaténation dans le code Html.
  • Enregistrer les modifications (CTRL + S) et basculer sur la fenêtre du navigateur,
  • Cliquer dans sa barre d'adresse pour l'activer,
  • Enfoncer la touche Entrée du clavier pour recharger la page,
  • Saisir volontairement une donnée incorrecte avec espaces comme : 18, 6 3 6,
  • Puis, soumettre le formulaire en cliquant sur le bouton Envoyer,
Traitement Php pour supprimer les espaces et remplacer la virgule par un point

Comme vous le constatez, le résultat retaillé de la donnée transmise s'affiche. La virgule est remplacée par un point tandis que tous les espaces ont disparu. En revanche, nous pouvons noter la flexibilité du code Php. La boucle pour la multiplication itérative est enclenchée sur la donnée d'origine non retravaillée. Et Php décèle bien la valeur numérique dans cette saisie erronée. Ceci peut parfois s'avérer dangereux si la saisie n'est pas volontaire.

Après avoir traité la donnée transmise, notre fonction doit s'assurer que celle-ci est bien numérique. De plus, elle doit retourner une indication précise sur sa nature. Pour ce faire, nous devons créer une boucle capable de parcourir tous les caractères de la valeur transférée jusqu'au dernier. Nous proposons d'exploiter la boucle for bornée que nous avons présentée lors de la formation précédente.
  • Revenir dans l'éditeur de code et compléter la fonction comme suit :
...
$transmis=str_replace(',' ,'.', str_replace('', '', $transmis));
$nb_car = strlen($transmis);

for ($indice=0; $indice<$nb_car; $indice++)
{
$caractere = substr($transmis,$indice,1);
if(strpos($val_ok,$caractere)==false)
{
$nb = false;
break;
}
else if($caractere=='.')
$nb_reel = true;
}


return $transmis;
...


La fonction Php strlen retourne le nombre de caractères contenus dans la chaîne qui lui est passée en paramètre. Nous l'exploitons pour initialiser une boucle partant de la valeur 0, soit le premier caractère à tester, à cette valeur renvoyée, soit le dernier caractère de la chaîne.

A chaque passage, nous ne prélevons que le caractère en cours, celui situé à l'indice du compteur de la boucle, grâce à la fonction php substr. Elle requiert trois paramètres qui sont dans l'ordre : la chaîne sur laquelle prélever, la position à partir de laquelle prélever et la longueur à extraire, un seul caractère bien entendu.

C'est ensuite la fonction PHP strpos dans une instruction conditionnelle qui est exploitée. Celle-ci retourne la position d'une occurrence cherchée, passée en second paramètre, dans une chaîne de caractères passée en premier paramètre. Si l'occurrence est trouvée, elle renvoie la position sinon elle retourne false. Ce critère est donc exploité dans une instruction if. Notez la syntaxe toute particulière, semblable à celle du Javascript pour l'égalité d'une condition. Il s'agit de doubler le symbole = (==). Un seul signifie l'affectation et ne permet pas de vérifier un critère.

Si elle retourne false donc, nous basculons le booléen nb en conséquence. Il servira à retourner les informations précises. De fait, nous mettons fin à l'exécution de la boucle par l'instruction break;. En effet, nous possédons déjà la conclusion quels que soit les caractères suivants.

Dans le cas contraire else if, nous cherchons la présence du point. Cette information identifierait la valeur numérique comme un nombre réel, décimal donc. C'est pourquoi nous basculons le booléen nb_reel à true pour indication future.

Précisément, il s'agit de retourner ces riches conclusions à l'envoyeur. Mais elles dépendent de l'état des booléens à la fin du traitement. Nous proposons donc de les tester par instructions conditionnelles et de concaténer les indications dans une chaine à retourner.
  • Compléter la fonction test_nb comme suit, sans oublier de remplacer l'instruction return,
...
else if($caractere=='.')
$nb_reel = true;
}

$chaine=$transmis.'<br />';
$chaine.='Elle est composée de <strong>'.$nb_car.' caractère(s)</strong>.<br />';
if($nb==true)
{
$chaine.='Il s'agit d'un nombre.<br />';
if($nb_reel==true)
$chaine.='Ce nombre est un <strong>réel</strong>.<br/>';
else
$chaine.='Ce nombre est un <strong>entier</strong>.<br/>';
}
else
$chaine.='Il s'agit d'un <strong>texte</strong>.<br/>';

return $chaine;

}

?>
...


Nous déclarons donc la variable chaine qui doit renfermer toutes les conclusions. Nous lui associons le résultat sur la valeur transmise et sur le test numérique. Constatez la notation .=, semblable à une incrémentation numérique mais cette fois pour la concaténation à poursuivre. En l'absence de ce point, la chaîne est écrasée. Selon l'état des booléens, nous concaténons les conclusions sur l'état de la valeur transmise.
  • Enregistrer les modifications et basculer sur la fenêtre du navigateur,
  • Cliquer dans sa barre d'adresse pour l'activer,
  • Enfoncer la touche Entrée pour recharger la page Web,
  • Saisir un texte puis le transmettre en cliquant sur le bouton Envoyer,
Créer une fonction PHP pour tester les valeurs numériques transmises du client au serveur

L'information est bien reçue et la conclusion est tout à fait correcte, y compris sur le nombre de caractères composant la chaîne. La boucle en revanche se trouve dans l'incapacité de réaliser les multiplications incrémentées.
  • Saisir une valeur numérique décimale cette fois et cliquer sur le bouton Envoyer,
La donnée est bien détectée comme un nombre réel. Notre fonction commence à s'avérer précieuse. La boucle s'enclenche puisque son critère consiste à réaliser le traitement jusqu'à la valeur entière directement inférieure à celle qui est transmise.

Fonction PHP pour détecter les décimales dans un nombre saisi depuis un formulaire Javascript
  • Saisir une valeur entière etl'envoyer,
Là encore la conclusion s'adapte parfaitement et l'indication précieuse est retournée dans le calque Html de la page Web.

Mais l'intérêt de cette fonction est simplement de tester les nombres. Selon son indication, nous devons savoir si nous pouvons enclencher le calcul. Dans le cas contraire, nous proposons d'enclencher une nouvelle fonction à créer, permettant de lister les mots clés composant la chaîne passée, détectée comme un texte.



Imbriquer les appels de fonctions PHP
Les résultats sont certes convaincants mais l'objectif de notre fonction est de retourner l'indication sur la nature de la donnée numérique. Selon le cas, elle doit enclencher des opérations textuelles ou numériques par appels de nouvelles fonctions à créer.
  • Revenir dans l'éditeur de code,
  • Créer les deux nouvelles fonctions suivantes, à la suite de la précédente :
function triple($val1)
{
return 'Le triple de : '.$val1.' vaut : <strong>'.($val1*3).'</strong><br/>';
}

function mots_cles($texte)
{
return 'Ses mots clés sont les suivants :<br />-'.str_replace(' ','<br />-',$texte).'<br /><br />';
}


La première demande un argument. Il s'agit de la valeur numérique approuvée. Elle calcule le triple du nombre et retourne le résultat sous forme de chaîne concaténée et formatée en Html.

La seconde réceptionne le texte et remplace tous les espaces par des balises Html <br />, soit des sauts de ligne, grâce à la fonction Php str_replace. Ainsi, elle permet d'énumérer distinctement l'ensemble des mots clés composant l'expression.
  • Dans la fonction test_nb, remplacer l'expression return $chaine; par return $nb;,
L'objectif consiste simplement à tester les valeurs pour engager l'une ou l'autre action par le biais des fonctions que nous venons de créer.
  • Dans la section PHP de réception de la valeur cliente, adapter le code comme suit :
if(test_nb($le_plafond)!=false)
{

$i=0;

while($i<$le_plafond)
{
$restitution.= $i.'*5 = <span style='color:#CC3300;'>'.$i*5;
$restitution.= '</span><br />';
$i++;
}
}
else
{
$restitution = '';
}


Nous exploitons la fonction test_nb en guise de critère d'une instruction conditionnelle If. Remarquez la notation similaire au Javascript pour signifier l'opérateur Différent de : !=. Ainsi, nous n'engageons le calcul de la multiplication récursive que lorsque la fonction test_nb certifie que la donnée fournie est bien numérique.
  • Dans la section Html pour la restitution, ajouter le code suivant, en supprimant l'appel de la fonction test_nb pour le retour de la variable dans la fonction echo :
La valeur transmise est <strong>:<?php echo $le_plafond;?></strong><br />
<?php
if(test_nb($le_plafond)!=false)
echo triple($le_plafond);
else
echo mots_cles($le_plafond);
?>


Nous opérons le même test pour engager l'une ou l'autre action, à l'aide de nos fonctions, selon la nature de la donnée transmise.
  • Enregistrer les modifications et revenir sur la fenêtre du navigateur,
  • Recharger la page en validant sa barre d'adresse,
  • Taper une valeur numérique et cliquer sur le bouton Envoyer,
Calcul sur valeur numérique transmise testée par une fonction Php

Comme vous le remarquez, le calcul itératif est enclenché car il s'agit d'un nombre et à ce titre, notre nouvelle fonction retourne son triple.
  • Taper un texte composé de plusieurs mots et cliquer sur le bouton Envoyer,
Décomposer mots clés chaîne de caractères transmise testée par fonction Php

Cette fois, le calcul itératif est neutralisé grâce au test sur la fonction test_nb. C'est l'autre nouvelle fonction qui est appelée. Elle énumère en effet distinctement l'ensemble des mots clés composant l'expression.

Comme nous le disions en préambule de cette formation, PHP propose de très nombreuses fonctions intégrées, mais encore faut-il les connaître.
  • Dans le code, remplacer les deux appels de la fonction test_nb par la fonction is_numeric,
  • Enregistrer les modifications et revenir sur la fenêtre du navigateur,
  • Recharger la page Web et réaliser des tests numériques et textuels,
Cette fonction Php, comme son nom l'indique, permet de savoir si la donnée est un nombre. Dans les deux cas, le résultat obtenu est le même que précédemment. Nous aurions donc pu nous passer de créer la fonction test_nb. Mais elle nous a permis de comprendre la construction et l'intérêt d'une fonction. En outre, elle est plus précise que la fonction is_numeric dans la mesure où elle est capable de fournir des renseignements sur la nature de la donnée : Nombre entier, nombre réel ou texte.

A l'avenir nous multiplierons l'emploi des fonctions pour optimiser nos codes PHP. Le code complet des fonctions PHP que nous avons créées est le suivant :

function test_nb($transmis)
{

$val_ok ='0123456789.';
$nb = true; $nb_reel=false;
$nb_car=0; $indice; $caractere='';


$transmis=str_replace(',', '.', str_replace('', '', $transmis));
$nb_car = strlen($transmis);

for ($indice=0; $indice<$nb_car; $indice++)
{
$caractere = substr($transmis,$indice,1);
if(strpos($val_ok,$caractere)==false)
{
$nb = false;
break;
}
else if($caractere=='.')
$nb_reel = true;
}

$chaine=$transmis.'<br />';
$chaine.='Elle est composée de <strong>'.$nb_car.' caractère(s)</strong>.<br />';
if($nb==true)
{
$chaine.='Il s'agit d'un nombre.<br />';
if($nb_reel==true)
$chaine.='Ce nombre est un <strong>réel</strong>.<br/>';
else
$chaine.='Ce nombre est un <strong>entier</strong>.<br/>';
}
else
$chaine.='Il s'agit d'un <strong>texte</strong>.<br/>';

return $nb;
}

function triple($val1)
{

return 'Le triple de : '.$val1.' vaut :<strong>'.($val1*3).'</strong><br />';
}

function mots_cles($texte)
{

return 'Ses mots clés sont les suivants :<br />-'.str_replace(' ','<br />-',$texte).'<br /><br />';
}


Ci-dessous est rappelé le code Php des appels et restitutions des fonctions :

<?php
if(isset($_POST['plafond']))
{
$le_plafond = $_POST['plafond'];
$restitution = 'La table de multiplication pour le chiffre 5 :<br/>';

if(test_nb($le_plafond)!=false)
{
$i=0;

while($i<$le_plafond)
{
$restitution.= $i.'*5 = <span style='color:#CC3300;'>'.$i*5;
$restitution.= '</span><br />';
$i++;
}
}
else
{
$restitution = '';
}
}
else
{
$le_plafond = 0;
$restitution = '';
}
?>
<div style='float:left;width:10%;height:40px;'></div>
<div style='float:left;width:80%;height:auto; text-align:center;'>
<div class='titre_h1'>
<h1>Découverte du PHP, Bienvenue !</h1>
<?php
if(isset($_POST['plafond']))
{
?>
<h2>Traitement itératif sur : <?php echo $le_plafond; ?>passage(s)</h2>
<br /><div style='width:auto;text-align:left; font-size:18px; padding-left:30%;'>
La valeur transmise est <strong>: <?php echo $le_plafond; ?></strong><br/>
<?php
if(test_nb($le_plafond)!=false)
echo triple($le_plafond);
else
echo mots_cles($le_plafond);
?>
<?php echo $restitution; ?>
</div><br />
<?php
}
?>
</div>
</div>


 
Sur Facebook
Sur G+
Sur Youtube
Les livres
Contact
Mentions légales



Partager la formation
Partager sur Facebook
Partager sur Google+
Partager sur Twitter
Partager sur LinkedIn