Modularité en PHP

1Include
2Fonctions
3Objets

Un souci constant des informaticiens est d'éviter de refaire plusieurs fois le même travail : mettre au point un programme est assez couteux pour ne pas vouloir devoir mettre au point une autre fois une code similaire.

Comme pour les bases de données, on veut éviter de devoir répercuter des modifications identiques dans différentes parties d'un programme, d'autant plus que les programmes grossissent.

C'est ainsi qu'est apparue la notion de modularité, de fonctions, et finalement d'objets (voir un autre module sur "structurer et modulariser les programmes et codes informatiques").

Les "include"

Un "include" est un appel à la fonction PHP qui permet d'insérer le contenu d'un fichier dans un autre fichier de code.

Pour la réalisation de sites Web, il est très utile dutiliser cette fonction pour factoriser les parties de code HTML qui sont les mêmes dans tout le site.

Ainsi, outre sa nécessité pour intermédier avec un serveur de bases de données, le langage PHP permet de composer une page Web à partir de plusieurs parties, de façon à ne pas avoir à recopier le même code pour toutes les pages devant contenir le même entête ou le méme bas de page.

Entete de BasDePage à part

  1. Sous le dossier de TP de cours, dans votre site d'essai, créez un dossier et nommez-le "_include". Ce dossier contiendra toutes les parties des pages composées.
  2. Dans ce dossier créez deux nouveaux fichiers nommés : "entete.php" et "basdepage".
  3. Modifiez les fichiers "entete.php" et "basdepage.php" et y introduire les lignes d'entête d'une page html, ainsi que la présentation que vous voulez préserver d'une page à l'autre dans votre site. Par exemple, vous pouvez récupérer le code suivant :
    "entete.php" "basdepage.php"
    <html>
      <head>
    	<title>mon site</title>
      </head>
    <body bgcolor="#ffffdd"
    	 alink="#004488"
    	 vlink="#666600"
    	 link="#008844">
      <center>
    	<table width="100%" bgcolor="#ffddaa">
    	  <tr>
    		<td width="20%" align="left">
    		  <a href="mailto:bidon@laposte.net">
    		    m'écrire
    		  </a>
    		</td>
    		<td align="center">
    		  <h1>Titre de mon site</h1>
    		</td>
    		<td width="20%" align="right">
    		  <p>en construction
    		</td>
    	  </tr>
    	</table>
      </center>
      <center>
    	<table width="100%" bgcolor="#ffddaa">
    	  <tr>
    		<td width="50%" align="right">
    		  <a href="../">
    		    retour
    		  </a>
    		</td>
    		<td width="50%" align="left">
    		  <p>le 30 septembre 2004
    		</td>
    	  </tr>
    	</table>
      </body>
    </center>
    </html>
  4. Dans le dossier de TP de cours, créez un nouveau fichier appelé : "index.php" et modifiez-le pour y mettre le code suivant :
    <?php include("_include/entete.php"); ?>
    	<p>Ceci est le fichier d'index de mes essais de TP de cours.
    	<table width="100%" bgcolor="#ffddaa">
    	  <tr>
    		<td align="right">
    		  <a href="essai.php">
    		    retour
    		  </a>
    		</td>
    		<td align="left">
    		  <p>mmes premiers essais en php
    		</td>
    	  </tr>
    	</table>
    <?php include("_include/basdepage.php"); ?>
  5. Visualisez le fichier d'index que vous venez de créer.

L'organisation des fichiers est comme dans l'image :

Et le résultat de ces manipulations donne :

include() est une fonction php qui insert le contenu d'un fichier dans un autre.

Le défaut des pages que nous venons de créer, est que le contenu du titre sera le même d'une page à la suivante, puisqu'il est inséré en "dur" dans le fichier d'entête.

Les fonctions

Les fonctions sont aussi utilisées pour structurer les programmes. Elles permettent de mémoriser des calculs ou de paramétrer la gération par PHP de plusieurs lignes. Des functions rendent par principe un résultat. La valeur de ce résultat est souvent testée pour vérifier que la fonction a réussi ou non a exécuter quelques commandes.

Pour illustrer les fonctions, nous allons prendre l'exemple de la lecture d'un fichier.

Imaginons que dans chaque dossier, vous ayez un fichier nommé "_titre.txt" qui contient le texte du titre du fichier d'index associé à ce dossier. Le contenu textuel de ce fichier est supposé tenir sur une seule ligne.

Créez un tel fichier "_TITRE.txt" dans un de vos dossiers. Puis insérez le code suivant dans le fichier "index.php" de ce dossier :

<?
function lit_lignfich ($nom_fich) {
	$rep=opendir('.');
	$lignfich = "";

	while (($file = readdir($rep)) && ($file != $nom_fich)) { 
	}
	if ($file == $nom_fich) {
		$fp = fopen($file,"r");
		if ($ligne = fgets($fp,81)) {
			$lignfich = $ligne;
		} 
	}  
	closedir($rep);
	clearstatcache();
	return $lignfich;
}
?>
<html>
<head>
<title>Page d'index générique</title>
</head>
<body>
<H1><? echo lit_lignfich ('_TITRE.txt'); ?></H1>
</body>
</html>

Pour essayer une copie de ce code, voir essais_funct/index1.php.
Pour voir le contenu du fichier 'TITRE.txt' suivre essais_funct/_TITRE.txt

Explications

Ce fichier non seulement définit une fonction, appelée lit_lignfich, mais aussi, il appelle des fonction pré-définies :

Toutes ces fonctions de traitement des fichiers et dossiers sont extrêmement utiles. Une description de toutes les fonctions PHP est accessible sur le site de Nexen : http://www.nexen.net/docs/php/annotee/language.basic-syntax.phpmode.php

Ce site illustre les descriptions de ces fonctions par de nombreux exemples d'utilisation. Et on peut rechercher des fonctions et des "morceaux"s de code qui répondent à un besoin donné

Une autre méthode pour s'approprier les fonctions PHP est de récupérer le code source de programmes en PHP, et de regarder ce qu'ils font.

Pour en revenir à la fonction lit_lignfich suit l'algorithme suivant :
  1. Ouvrir le dossier courant
  2. Tant qu'on trouve quelque chose dans le dossier et que le nom de l'élément trouvé n'a pas le nom du fichier cherché :
    quand on sort de cette boucle
    • soit on a finit de parcourir le dossier courant
    • soit on est tombé sur le fichier cherché
  3. Si on a trouvé le fichier cherché
    1. Ouvrir le fichier en question
    2. Si ce fichier contient une ligne de caractères, on en récupère au plus 80 (plus 1 pour le caractère de fin de ligne)
  4. Fermer le dossier
  5. Rendre la mémoire utilisée
  6. Transmettre le contenu de la chaîne trouvée
La fonction ainsi définie est appelé par la ligne : <H1><? echo lit_lignfich ('_TITRE.txt'); ?></H1> qui insère la chaîne renvoyé par notre fonction entre les balises HTML de début et de fin de titre de niveau 1.

Modularité et librairie

Lorsque les fonctions que l'on écrit sont suffisament génériques, on les regroupe par ce dont elles traitent en les enregistrant dans des fichiers de "librairies".

Remarque : il est trés important de commenter ses fonctions, en expliquant quels sont les paramètres d'appel attendu ainsi que le résultat et ce à quoi elles sont vouées.

Suite de l'exemple

Complétez l'exemple précédent avec la fonction suivante :

<?
function liste_contenudos ($nom_dossier) {
	$str_res="";
	
	$sauv_chem=getcwd();
	chdir($nom_dossier);
	$rep=opendir($nom_dossier);

	while ($file = readdir($rep)) { 
		if  (($file != 'index.php') &&($file != '.')&&($file != '..'))
			$str_res .= "\n\t<p><a href='$file'>$file</a>";
	}

	closedir($rep);
	clearstatcache();
	chdir($sauv_chem);
	
	return $str_res;
}
?>

et ajouter après le titre trouvé dans "_TITRE.txt", l'appel à cette fonction :

<?
echo liste_contenudos('.');
?>

Pour essayer une copie de ce code, voir essais_funct/index2.php.

Ecrivez une description de ce code sur le modèle de la description précédente.

Les objets

La version 5 de PHP introduit dans PHP la notion d'objets, avec des fonctions "constructeur" et des opérateurs spécifiques.

Nous n'aborderons pas cet aspect dans ce cours.

Cependant, le chapitre sur Javascript introduit les notions d'objet, de classe, d'instance et d'héritage qui caractérise les langages à objets.

Lien

Concepts fondamentaux de l'informatique et de la Programmation :
http://www.programmationworld.com/site/Cours.asp?Action=cours&numero=20