Sécurité

Include

6.Le langage PHP

6.7.Include

6.7.1.Introduction

Pour résoudre un problème complexe, bien souvent, la meilleure solution consiste à le découper en plusieurs petits problèmes plus simples à appréhender. Il en est de même pour les sites web.
Généralement, un script PHP est composé d'appels à des fonctions que l'on peut regrouper par thèmes (manipulation de chaînes de caractères, accès à une base de données, lecture dans un fichier, etc...). Il est alors possible d'associer à chaque thème un ou plusieurs scripts, pour constituer ce que l'on appelle une bibliothèque (de fonctions).
Nous vous proposons donc de découvrir comment intégrer ces bibliothèques dans vos scripts PHP via la fonction include() et (surtout) ses variantes.
Enfin, nous verrons qu'il peut être parfois assez difficile de localiser avec précision les scripts à inclure et nous présenterons les différentes façon d'y remédier.
Puisqu'il s'agit d'une méthode qui a été longtemps utilisée, nous verrons qu'il est également possible d'intégrer une portion de vue dans un script PHP (et faciliter la mise en page) tout en gardant à l'esprit qu'il sagit là d'une façon de faire bien obsolète qui en outre n'est pas sans présenter quelques risques en matière de sécurité.
C'est pourquoi nous vous alerterons également sur les règles de sécurité à connaître dans le cadre de l'utilisation des fonctions présentées dans ce chapitre.
Notez que si vous utiliser un framework PHP comme Zend Framework, une fois celui-ci mis en place, vous n'aurez plus à vous soucier de l'utilisation de ces méthodes d'inclusion. Pour autant, il est fortement conseillé d'en comprendre les rouages.

6.7.2.Include et les bibliothèques de fonction

Pour pouvoir utiliser des fonctions définies dans une bibliothèque, il faut inclure, dans vos scripts PHP, la ou les fichiers de la bibliothèque. Cela ne se fait évidemment pas par une recopie du code mais par appel à la fonction (ou instruction) include() qui, en quelque sorte se décline en include_once(), require() et require_once().
Un appel à include() suivi d'un nom de fichier aura tout simplement pour effet d'en inclure son contenu à l'endroit de l'appel.
Ainsi le script suivant
<?php
include("include_inc.php");

$resultat = cube(3);
echo $resultat;
?>
qui fait appel à
<?php
function cube($x) {
     return $x*$x*$x;
}
?>
est équivalent à
<?php
function cube($x) {
     return $x*$x*$x;
}

$resultat = cube(3);
echo $resultat;
?>
rem
  • Vous noterez toutefois que le fichier inclus est considéré comme un fichier texte brut (ou HTML) et qu'il faut donc "ré-ouvrir" les balises <?php pour intégrer du code PHP. De ce fait, le fichier inclus est un fichier PHP comme un autre.
  • Dans nos exemples, nous prendrons pour habitude de donner une extension _inc.php aux fichiers destinés à être inclus.
  • Le chemin du fichier inclus (s'il n'est pas donné de façon absolue) doit être le chemin relatif au script appelé et non relatif au script d'où est fait le include. Il y a en effet différence entre les deux lorsque le fichier faisant un include est lui-même un fichier inclus (par le script appelé). Pour éviter tout problème lié à ce point, veuillez consulter la section "Erreurs fréquentes".

6.7.3.include_once, require et require_once

Nous ne reviendrons pas sur l'historique et les changements de comportement des fonctions de type include(). Nous nous contenterons donc d'en décrire les propriétés depuis PHP>=4.0.2.
Lorsque des scripts inclus, incluent eux-même d'autres scripts, il peut arriver que bien malgré vous, vous incluiez plusieurs fois le même script. Si ce dernier contient une déclaration de fonction ou de classe, cela conduira inévitablement à une erreur de redéclaration. Pour éviter ce problème, vous pouvez utiliser include_once() à la place d'include(). Son comportement est identique si ce n'est qu'un script déjà inclus ne sera pas inclus une seconde fois.
Lorsqu'un script inclus par include() ou include_once() lève une erreur, le script principal poursuit son exécution comme si de rien n'était. Même si dans certains cas, cela peut-être le comportement espéré, il existe également de nombreux cas, pour lesquels, l'échec du script inclus est rédibitoire. Aussi, si vous préférez que le script principal s'arrête en cas d'échec du script inclus privilégiez l'instruction require() ou require_once().
Ici vous pouvez apprendre :
Version imprimable: imprimer