PHP (PHP Hypertext Preprocessor)

Auteur: Mohamed CHINY Durée necessaire pour le cours de PHP (PHP Hypertext Preprocessor) Niveau recommandé pour le cours de PHP (PHP Hypertext Preprocessor) Supports vidéo non disponibles pour ce cours Exercices de renforcement disponibles pour ce cours Quiz disponible pour ce cours

Page 13: Inclusions et arrêts prématurés

Toutes les pages

Les inclusions

Il se trouve qu'un bout de code figure dans plusieurs documents constituants notre projet Web (site ou application). Il s'agit souvent de codes qui assurent la connexion à la base de données ou à définir des éléments qui figurent systématiquement sur toutes nos pages, comme les entêtes, bas de pages et menu de navigation.

Le fait de déclarer le même code dans plusieurs pages rend celui-ici difficile à maintenir. En effet, imaginons que nous voulons nous connecter à une base de données du nom de "mabase" installée sur le serveur local et à laquelle on peut accéder avec l'utilisateur "user" et le mot de passe "pass". Si on veut se connecter à la base de données en utilisant PDO (PHP Data Object), la syntaxe ressemblerait à ceci:
<?php
   $pdo=new PDO(
   "mysql:host=localhost; dbname=mabase",
   "user",
   "pass"
   );
?>
Notez que dans le cours de PHP5 nous allons voir en détail l'objet PDO qui permet au programme PHP d’interagir avec une base de données d'une manière très souple.
On imagine alors que dans la plupart de nos pages PHP, nous allons déclarer le code précédent (connu aussi par chaîne de connexion) afin qu'ils puisent interroger la base de données. Le problème se posera quand on décidera de modifier ce code suite à un nouveau paramétrage du SBGD (comme la modification du mot de passe par exemple). Dans ce cas, il faut modifier le modifier au sein de toutes les pages Web qui le contiennent une à une. Imaginez l'ampleur du travail si notre projet Web est constitué d'un nombre important de pages.

La solution consiste donc à déclarer le code souhaité dans un fichier à part et l'inclure à chaque fois qu'on en aura besoin. Dans ce ces, la modification du code sera très simple car il n'y a qu'une seule page à éditer.

Structure include

La structure include permet d'appeler un fichier dans la page où elle a été déclarée. On la prend à tort pour une fonction, mais en réalité il s'agit d'un structure et par conséquent, les parenthèses ne sont pas obligatoire.

La syntaxe de la structure include ressemble à ceci:
<?php
   include "fichier_à_inclure";
   // ou bien
   include("fichier_à_inclure");
?>
Les deux instructions sont correctes, bien que personnellement je préfère utiliser include avec les parenthèses comme une fonction.

Exemple:

Contenu du fichier "inc.php":
<?php
   echo "Ce texte provient de <b>inc.php</b>";
?>
Contenu du fichier "appel.php":
<?php
   include("inc.php");
?>
Après execution de "appel.php" on obtient:
Ce texte provient de inc.php
Supposons maintenant qu'on s'est trompé du nom du fichier à inclure comme ceci:
<?php
   include("incs.php");
?>
Après exécution on obtient quelque chose qui ressemble à cela:
Warning: include(incs.php) [function.include]: failed to open stream: No such file or directory in appel.php on line 2

Warning: include() [function.include]: Failed opening 'incs.php' for inclusion (include_path='.;C:php5pear') in appel.php on line 2
Le message est explicite. Le fichier qu'on a tenté d'inclure n'existe pas, ce qui génère une erreur de notification (warning). Cette erreur n'interrompe pas l’exécution du document, alors on aurait pu masquer la notification affichée en ajoutant arobas avant la structure include().
La structure include (et les autres structures qu'on verra plus bas) n'incluent pas que des document PHP, mais elle peuvent inclure des document de tout type, en particulier les documents HTML.

Structure require

La structure require fonctionne pratiquement comme include. Il s'agit aussi d'une structure mais on peut la déclarer avec des parenthèses. La principale différence entre les deux structures c'est qu'à l'inverse de include qui se contente d'afficher une notification si le fichier appelé n'est pas accessible, require quant-à-elle arrête nettement l’exécution du programme.

Imaginons que j'ai déclaré le dernièr code à l'aide de require:
<?php
   require("incs.php");
?>
Voilà à quoi ressemble le résultat:
Warning: require(incs.php) [function.require]: failed to open stream: No such file or directory in appel.php on line 2

Fatal error: require() [function.require]: Failed opening required 'incs.php' (include_path='.;C:php5pear') in appel.php on line 2

Structures include_once et require_once

La structure include_once fonctionne exactement comme la structure include. Cependant include_once n'inclue le même fichier qu'une seule fois. En effet, au moment de son exécution, le compilateur vérifie si le fichier n'est pas déjà inclus. Si c'est le cas, il sera ignoré sinon il sera inclus.

La structure require_once se comporte comme require mais n'inclue, elle aussi, le même fichier qu'une seule fois.

Les arrêts prématurés

Dans le cas normal, un programme s’exécute du début à la fin. L'arrêt de l’exécution après avoir passé en vue toutes les instructions est donc tout à fait logique. Cependant, il se peut qu'un programme s'arrête avant d'atteindre la fin prévue et cela est du principalement à l'une des raisons suivantes:
  • Erreur fatale: il s'agit d'une erreur stricte qui empêche le programme de se poursuivre. Néanmoins, ce genre d'erreur pousse le compilateur à ne rien exécuter du tout car le langage PHP est compilé.
  • Arrêt prématuré: il s'agit d'un arrêt programmé par le développeur. Dans ce cas, même si le programme ne s’exécute pas en entier, son arrêt est considéré comme normal car il a été prévu.

Arrêt prématuré avec exit() et die()

Les fonction exit() et die() sont similaires (des alias). Elles arrêtent le programme à l'endroit où elle sont déclarées en affichant le message passé en argument (en tant que chaîne de caractères).

Exemple:
<?php
   for($i=1;$i<=10;$i++){
      if($i>5)
         die("Fin");
      echo "Ligne $i <br />";
   }
?>
Ce qui donne:
Ligne 1
Ligne 2
Ligne 3
Ligne 4
Ligne 5
Fin
Notez qu'on peut réussir le même traitement avec return qui met terme à la fonction. Cependant, l’exécution du code se poursuivra après l'endroit où celle ci est appelée. Par contre, avec die() (ou exit()), le programme entier sera interrompu.