Créée le, 19/06/2015

 Mise à jour le, 12/05/2019

Visiteurs N°  




Accueil
Nouveau Blog Nouveautés Moteur de Recherche Votre Caddie Pour Vos Achats Votre Espace Membre Vos Signets et Vos Jeux Préférés Page de Bienvenue Statique Site en Français Site en Anglais
Sommaires
Électronique Fondamentale Technologie Fondamentale Testez vos Connaissances Électronique Théorique Digitale Électronique Pratique Digitale Lexique Électronique Numérique Data book TTL Data book CMOS Dépannage TVC Mathématique
Micro-ordinateurs
Théorique des Micro-ordinateurs Testez vos Connaissances Pratique des Micro-ordinateurs Glossaires sur les Ordinateurs
Physique
La lumière Champ d'action Rayonnement Électromagnétique
Technologies
Classification des Résistances Identification des Résistances Classification des Condensateurs Identification des Condensateurs
Formulaires Mathématiques
Géométrie Physique 1. - Électronique 1. 2. - Électronique 1. 3. - Électrotechnique 1. 4. - Électromagnétisme
Accès à tous nos Produits
E. T. F. - Tome I - 257 Pages E. T. F. - Tome II - 451 Pages E. T. F. - Tome III - 611 Pages E. T. D. - Tome I - 610 Pages N. B. M. - Tome I - 201 Pages E. T. M. - Tome I - 554 Pages Business à Domicile Ouvrages 34 pages gratuits Nos E-books Logiciel Géométrie Logiciel Composants Électroniques
Aperçu de tous nos Produits
E. T. F. - Tome I - 257 Pages E. T. F. - Tome II - 451 Pages E. T. F. - Tome III - 611 Pages E. T. D. - Tome I - 610 Pages E. T. M. - Tome I - 554 Pages Logiciel Géométrie Logiciel Composants Électroniques
Nos Leçons aux Formats PDF
Électronique Fondamentale Technologie Fondamentale Électronique Théorique Digitale Électronique Pratique Digitale Théorique des Micro-ordinateurs Mathématiques
Informatique
Dépannage Win98 et WinXP et autres Dépannage PC Glossaire HTML et Programmes PHP et Programmes JavaScript (en cours de travaux) Création de plusieurs Sites
Forums
Forum Électronique et Infos Forum Électronique et Poésie
Divers et autres
Formulaire des pages perso News XML Statistiques CountUs Éditeur JavaScript Nos Partenaires et nos Liens Utiles Gestionnaire de Partenariat Nos Partenaires MyCircle Sondages 1er Livre d'Or 2ème livre d'Or

Signets :
  Leçons suivantes        Leçons précédentes     Bas de page
  Cliquez ici pour la leçon suivante ou dans le sommaire prévu à cet effet


Utilisation de fonctions (suite), en PHP (3ème partie) :



Passer par référence contre passer par valeur :

Pour implémenter une fonction appelée incrementation(), et permettant d'incrémenter une valeur, nous pourrions être tenté d'écrire le code suivant :

    function incrementation ($value, $montant = 1)

       {

          $value = $value + $montant ;

       }

Ce code ne produit pourtant pas le résultat recherché : l'exécution des lignes suivantes produit la valeur "10" comme résultat :

    $value = 10 ;

    incrementation ($value) ;

    echo $value ;

L'appel de la fonction incrementation() ne provoque aucune modification du contenu de la variable $value. Ce résultat est directement l'expression des règles de portée. Le code de cet exemple crée une variable appelée $value, qui contient la valeur 10. Il invoque ensuite la fonction incrementation(). La variable $value utilisée au sein de la fonction incrementation() est créée au moment de l'appel de la fonction. L'interpréteur PHP ajoute 1 à cette variable, qui prend par conséquent la valeur 11 au sein de la fonction, et jusqu'à la fin de la fonction. L'interpréteur revient ensuite au code qui a invoqué incrementation(). Dans ce code, $value est une variable différente, de portée globale, dont le contenu n'a pas changé.

Nous pourrions résoudre ce problème en déclarant $value dans la fonction, en tant que variable globale. Mais pour utiliser la fonction incrementation(), nous serions alors dans l'obligation de donner le nom $value à la variable à incrémenter. Une meilleure solution s'offre heureusement à nous : passer par "référence".

Les paramètres d'une fonction sont normalement passés à la fonction "par valeur". Lorsqu'un paramètre est passé à une fonction, l'interpréteur PHP crée une nouvelle variable contenant la valeur transmise. Il s'agit là d'une copie de la variable originale. Cette valeur copiée peut ainsi être modifiée à loisir, sans que la valeur de la variable d'origine en soit affectée (hors de la fonction).

Passer les paramètres par référence apparaît toutefois préférable, bien que ce ne soit pas l'approche la plus courante. Dans ce cas, l'interpréteur PHP, au lieu de créer une nouvelle variable pour le paramètre passé à la fonction, donne à la fonction une référence sur la variable d'origine. A cette référence est associé un nom de variable, qui commence par un signe dollar. Une référence peut être utilisée comme toute variable autre. Cependant, au lieu de posséder sa propre valeur, une référence pointe sur la valeur d'origine. Toute modification apportée à la référence est répercutée sur la variable originale.

Pour notifier qu'un paramètre est passé par référence, il suffit de le faire précéder d'une esperluette (&) dans la définition de la fonction. L'appel de la fonction ne nécessite aucune modification.

Dans l'exemple précédent, nous pouvons modifier la fonction incrementation() pour aboutir au résultat recherché, en passant à la fonction un paramètre par référence comme suit :

    function incrementation (&$value, $montant = 1)

       {

          $value = $value + $montant ;

       }

Ainsi formulée, notre fonction est opérationnelle, et nous avons toute liberté pour le choix du nom de la variable à incrémenter. Comme nous l'avons déjà mentionné, l'utilisation d'un même nom de variable au sein et hors d'une fonction est source de confusion pour les humains, si bien que nous attribuerons un nouveau nom à la variable utilisée dans le script principal. Le code de test qui suit conduit à l'affichage du nombre 10 dans la fenêtre du navigateur avant l'appel de la fonction incrementation(), et du nombre 11 après l'appel de la fonction.

    $nombre = 10 ;

    echo $nombre ;

    incrementation ($nombre) ; // Appel de la fonction incrementation par Référence

    echo $nombre ;

Sortie forcée d'une fonction :

Le mot clé return permet d'interrompre l'exécution d'une fonction. Lorsque l'exécution d'une fonction prend fin, soit parce que toutes ses instructions ont été exécutée, soit parce que le mot clé return a été atteint, l'exécution se poursuit par un retour à l'instruction qui fait suite à l'appel de la fonction.

A l'appel de la fonction suivante, seule la première instruction echo est exécutée :

<?PHP

    function retour_d_essai()

       {

          echo " Cette d&eacute;claration sera ex&eacute;cut&eacute;e " ;

          return ;

          echo " Cette d&eacute;claration ne sera jamais ex&eacute;cut&eacute;e " ;

       }

          retour_d_essai() ; // Appel de la fonction

?>

Cet usage du mot clé return n'est évidemment pas des plus utiles. Normalement, le mot clé return s'emploie pour sortir d'une fonction, au milieu de la fonction, lorsqu'une condition spécifiée a été satisfaite.

Une condition d'erreur représente ainsi une raison typique de mise en œuvre d'une instruction return, pour interrompre l'exécution d'une fonction avant sa fin. Par exemple, supposez qu'il nous faille écrire une fonction déterminant, quel est le plus grand de deux nombres ? Il faudrait que l'exécution de la fonction puisse être interrompue si l'un des deux nombres n'a pas été fourni.

<?PHP

    function plus_grand ($x, $y)

       {

          if (!isset ($x) || !isset ($y))

          {

       echo " <BR /> Cette fonction n&eacute;cessite uniquement que deux nombres. " ;

       return ;

          }

          if ($x >= $y)

          echo "<BR />" . $x ;

          else

          echo $y ;

       }

La fonction prédéfinie isset() permet de déterminer si une variable a bien été créée, et si elle contient une valeur. Dans le code précédent, un message d'erreur est généré et l'exécution de la fonction s'interrompt si l'un des paramètres n'a pas été fourni avec une valeur. Pour cela, un test par !isset() est effectué. !isset() signifie "NON isset()", et l'instruction if de ce fragment de code peut être lu comme "si x n'est pas ajustée ou si y n'est pas ajustée". L'exécution s'interrompt si l'une de ces conditions est vraie.

Lorsque l'interpréteur PHP atteint une instruction return dans une fonction, il n'exécute pas les lignes de la fonction qui suivent l'instruction return. L'exécution se poursuit au niveau du point du programme où se situe l'appel de la fonction. Si les deux paramètres sont bien ajustés, la fonction affiche dans la fenêtre du navigateur la valeur du plus grand des deux paramètres ou nombres.

Et enfin, pour l'exécution du code suivant concernant le programme ci-dessus :

    $a = 1 ;

    $b = 4.5 ;

    $c = 2.9 ;

    plus_grand ($a, $b) ;

    plus_grand ($c, $a) ;

    plus_grand (@$d, $a) ;

?>

Conduit au résultat suivant :

    4.5

    2.9

    Cette fonction n&eacute;cessite uniquement que deux nombres.

Renvoi de valeurs par des fonctions :

L'usage du mot clé return ne se limite pas à l'interruption de l'exécution d'une fonction. Dans nombre de fonctions, une instruction return est mise en œuvre pour communiquer avec le code qui a invoqué la fonction. La fonction plus_grand() pourrait se révéler plus utile si le résultat de la comparaison effectuée était renvoyé au lieu d'être affiché dans le navigateur. C'est alors dans le code du script principal que se déciderait l'affichage ou l'utilisation de ce résultat. La fonction max() prédéfinie dans PHP a exactement cette fonctionnalité.

<?PHP

    function plus_grand ($x, $y)

       {

          if (!isset ($x) || !isset ($y))

          return - 1.7E+308 ;

          else if ($x >= $y)

          return $x ;

          else

          return $y ;

       }

          $a = 1 ;

          $b = 4.5 ;

          $c = 2.9 ;

La fonction plus_grand() renvoie à présent la plus grande des deux valeurs qui lui sont passées comme paramètres. Une valeur bien sûr différente est renvoyée en cas d'erreur. Si l'un des nombres à comparer n'est pas fourni, la fonction renvoie le nombre - 1.7 x 10308, qui est très petit et peu susceptible d'être confondu avec une réponse valide. La fonction prédéfinie max() a un comportement légèrement différent, puisqu'elle ne renvoie rien lorsque les deux variables à la fois n'ont pas été fournies. Lorsque seulement une des deux variables a été fournie, max() renvoie la valeur de cette variable.

Pour information :

Pourquoi choisir le nombre - 1.7 x 10308 ? Dans nombre de langages, des valeurs minimales et maximales sont imposées pour les nombres. Ce n'est malheureusement pas le cas avec PHP. Le nombre - 1.7 x 10308 est le plus petit nombre supporté par la version 4.0 de PHP. Si ce type de comportement est important dans vos projets, gardez bien à l'esprit que cette limite n'est pas garantie pour les versions futures. Etant donné que la limite en taille actuelle est basée sur le type de données double du langage C sous-jacent, elle peut varier d'un système d'exploitation ou d'un compilateur à l'autre.


Le code qui suit du programme ci-dessus :

    echo plus_grand ($a, $b) . "<BR />" ;

    echo plus_grand ($c, $a) . "<BR />" ;

    echo plus_grand (@$d, $a) . "<BR />" ;

?>

Produit le résultat suivant :

    4.5

    2.9

    - 1.7E+308

Souvent, les fonctions qui accomplissent des tâches, mais qui n'ont pas à renvoyer de valeur, renvoient les valeurs true ou false pour signaler si elles ont réussi ou échoué. Les valeurs true et false peuvent être respectivement représentées par 1 et 0.

Blocs de code :

Pour déclarer qu'un groupe d'instructions constitue un bloc de code, il suffit de le placer entre accolades. Le fonctionnement du code s'en trouve très peu affecté. Par contre, la déclaration d'un bloc de code a des implications spécifiques, notamment sur la manière dont sont exécutées les structures de contrôle telles que les boucles et les structures conditionnelles.

Les deux exemples de code qui suivent donnent ainsi des résultats très différents.

Exemple sans bloc de code :

<?PHP

          echo " <BR /> " ;

       for ($i = 0 ; $i < 3 ; $i++)

          echo "&nbsp; Ligne 1 <BR />" ;

          echo "&nbsp; Ligne 2 <BR />" ;

          echo "&nbsp; Ligne 3 <BR />" ;

?>

Exemple avec bloc de code :

<?PHP

          echo " <BR /> " ;

       for ($i = 0 ; $i < 3 ; $i++)

       {

          echo "&nbsp; Ligne 1 <BR />" ;

          echo "&nbsp; Ligne 2 <BR />" ;

          echo "&nbsp; Ligne 3 <BR />" ;

       }

?>

Dans ces deux exemples, la boucle for est répétée trois fois de suite. Dans le premier exemple, seule l'instruction qui succède immédiatement à l'instruction for est exécutée dans la boucle. Le résultat obtenu est le suivant :

    Ligne 1

    Ligne 1

    Ligne 1

    Ligne 2

    Ligne 3

Dans le second exemple, un bloc de code est mise en œuvre pour regrouper trois lignes de code. Il s'ensuit que les trois lignes ainsi regroupées sont exécutées trois fois de suite dans la boucle for, avec le résultat suivant :

    Ligne 1

    Ligne 2

    Ligne 3

    Ligne 1

    Ligne 2

    Ligne 3

    Ligne 1

    Ligne 2

    Ligne 3

Grâce aux mises en retrait du code, la différence entre ces deux exemples apparaît au premier coup d'œil. La mise en retrait vise à donner aux lecteurs du code une indication visuelle sur les lignes qui sont affectées à la boucle for. Notez que l'insertion de caractères espace dans le code n'affecte pas la manière dont l'interpréteur PHP traite le code.

Dans certains langages, les blocs de code affectent la portée des variables. Ce n'est pas le cas en PHP.

Récursion :

Le langage PHP supporte les fonctions récursives. Une fonction "récursive" est une fonction qui s'appelle elle-même. Ce type de fonction se révèle particulièrement utile pour naviguer dans des structures de données dynamiques, telles que des listes et des arborescences liées.

Toutefois, les applications orientées Web qui requièrent des structures de données d'une telle complexité sont assez rares, si bien que la possibilité de récursion n'est que rarement exploitée en PHP. Dans nombre cas, la récursion peut être utilisée à la place d'une répétition (d'une itération), parce qu'elle consiste également à opérer de manière répétitive. Les fonctions récursives sont plus lentes et consomment plus de mémoire que les itérations. Par conséquent, vous avez tout intérêt à préférer les itérations aux récursions, lorsque cela est possible.

Pour que cette étude soit complète, nous allons examiner l'exemple présenté ci-dessous.

Une chaîne peut être facilement inversée au moyen d'une récursion. La version par itération est également donnée.

<?PHP

          echo " <BR /> " ;

       function sens_inverse_recursion($str)

       {

          if (strlen($str) > 0)

          sens_inverse_recursion(substr($str, 1)) ;

          echo substr($str, 0, 1) ;

          return ;

       }

       function sens_inverse_iteration($str)

       {

          for ($i = 1; $i <= strlen($str) ; $i++)

       {

          echo substr($str, -$i, 1) ;

          }

          return ;

       }

          sens_inverse_recursion ("Hello") ;

          echo "<BR />" ;

          sens_inverse_iteration("Hello") ;

?>

Le programme ci-dessus contient deux fonctions, qui impriment toutes deux à l'envers la chaîne qui leur est fournie comme argument. La fonction sens_inverse_recursion() est récursive, tandis que la fonction sens_inverse_iteration() est itérative.

La fonction sens_inverse_recursion() prend une chaîne comme paramètre. Lorsqu'elle est invoquée, elle opère en s'appelant elle-même, et en se passant chaque fois du deuxième au dernier caractère de la chaîne. Par exemple, cet appel :

    sens_inverse_recursion("Hello") ;

Se traduit par la série d'appels suivante :

    sens_inverse_recursion("ello") ;

    sens_inverse_recursion("llo") ;

    sens_inverse_recursion("lo") ;

    sens_inverse_recursion("o") ;

    sens_inverse_recursion("") ;

Chaque fois que la fonction s'appelle elle-même, une nouvelle copie du code de la fonction est effectuée dans la mémoire du serveur, mais avec un paramètre différent. Tout se passe comme si une fonction différente était invoquée chaque fois. Ce fonctionnement permet d'éviter la confusion entre les différentes instances de la fonction.

A chaque appel, la longueur de la chaîne est évaluée. Lorsque l'interpréteur PHP atteint la fin de la chaîne (strlen() == 0), la condition n'est plus satisfaite. L'instance de la fonction la plus récente (sens_inverse_recursion("")) se poursuit par l'exécution de la prochaine ligne de code, qui conduit à l'impression du premier caractère de la chaîne qui a été passée comme paramètre. A ce stade, il n'y a pas de caractère, parce que la chaîne est vide.

Ensuite, cette instance de la fonction renvoie le contrôle à l'instance qui l'a appelée, c'est-à-dire sens_inverse_recursion("o"). Celle-ci imprime le premier caractère de sa chaîne, en l'occurence "o", et renvoie le contrôle à l'instance qui l'a invoquée.

Le processus se poursuit ainsi, imprimant un caractère puis renvoyant le contrôle à l'instance précédente de la fonction dans l'ordre d'appel, jusqu'à ce que le contrôle soit renvoyé au programme principal

Nous terminons cette cinquième leçon et nous verrons dans la prochaine, l'usage de certaines Créations de Classes puis nous aborderons la Base de Données ainsi que le codage MySQL.










Nombre de pages vues, à partir de cette date : le 23 MAI 2019

compteur de visite

    




Envoyez un courrier électronique à Administrateur Web Société pour toute question ou remarque concernant ce site Web. 

Version du site : 10. 5. 14 - Site optimisation 1280 x 1024 pixels - Faculté de Nanterre - Dernière modification : 19 MAI 2019.   

Ce site Web a été Créé le, 14 Mars 1999 et ayant Rénové, en MAI 2019.