Pour inclure un script dans un autre script, on peut utiliser les mots clefs "require
" ou "include
". Seulement, connaissez-vous la différence entre les deux ? Lequel doit on utiliser ? Peut-être connaissez-vous déjà la réponse, mais je constate souvent que certains les utilisent indifféremment sans trop vraiment se poser de questions.
Petit retour en arrière.
Avant la version 4.0.2, la différence entre les deux était très importante. En effet, le mot clef "require
" pratiquait l'inclusion du script au moment de l'analyse et non de l'exécution.
Regardons le script suivant de plus près :
<?php
function affiche_index( $chemin ) {
require $chemin . 'index.html';
}
echo 'début';
affiche_index('cache/');
?>
Ce code n'affiche pas "début
" et génère une erreur fatale indiquant l'impossibilité d'ouvrir "index.html
".
En fait, au moment de l'analyse, PHP a tenté d'ouvrir immédiatement le fichier, mais comme le contenu de la variable "$chemin
" n'existe pas encore, il l'a considéré comme vide.
Ainsi, en utilisant le mot clef "include
" à la place de "require
", PHP n'effectue cette opération qu'au moment même de son utilisation.
L'avantage du "require
" est donc la performance car cette inclusion n'est faite qu'une seule fois, même si elle est placée dans une boucle de plusieurs millions d'itérations, mais en contrepartie, vous ne pouvez pas l'utiliser si le chemin n'est pas complètement défini.
Le code suivant sera correct :
<?php
$chemin = 'cache/';
require $chemin . 'index.html'
?>
En effet, le contenu de $chemin
est fixé au moment de l'analyse car l'affectation est une valeur constante.
En maintenant ?
En fait, cette différence a disparu à la sortie de la version 4.0.2 et l'inclusion s'effectue désormais au moment de l'exécution.
Mais une petite nuance existe et elle fait toute la différence. Tandis que "require
" génère une erreur fatale en interrompant brutalement le script, "include
" ne fait que générer un avertissement puis poursuit l'exécution.
Remarque : En fait, PHP génère deux erreurs, la première (avertissement) indiquant que le fichier n'existe pas et la seconde (fatale ou avertissement) indiquant que l'inclusion n'a pas pu être effectuée.
Il est donc recommandé dans la très grande majorité des cas d'utiliser "require
" afin d'interrompre le script lorsqu'un fichier est nécessaire au fonctionnement de l'application et d'utiliser "include
" uniquement dans les cas où le script inclus peut-être absent. Bien évidemment dans le cas de "include
", il faut gérer le cas où le script n'existe pas.
Valeur de retour
"require
" et "include
" retourne la valeur entière "1
" lorsqu'on les appelle, et retourne le booléen "false
" en cas d'erreur. En fait, il n'y a que "include
" qui peut retourner "false
" car "require
" arrête le script avant même de faire le retour.
Remarque : Vous pouvez utiliser le mot clef "return
" dans le script inclus comme pour une fonction et dans ce cas, la valeur de retour de "require
" ou de "include
" sera modifiée en conséquence. Vous pouvez d'ailleurs retourner "false
" pour faire croire que l'inclusion n'a pas fonctionnée correctement.
Tester l'existence ou gérer l'erreur ?
On pourrait être tenté de gérer les inclusions de deux manières différentes :
En testant l'existence du fichier à inclure :
<?php
if( file_exists( 'premier.txt' ) ) require 'premier.txt';
else require 'deuxième.txt';
?>
En exploitant l'optimisation du "ou" :
<?php
@include 'premier.txt' or require 'deuxième.txt';
?>
Si on compare les performances des deux solutions, on s'aperçoit que la première est bien plus performante que la seconde, ce qui n'est pas une mauvaise chose car la première solution est bien plus claire en terme de "logique".
L'avantage de la deuxième forme (outre sa concision), c'est sa gestion d'une valeur de retour "false
" générée par le fichier inclus.
Remarque : Dans mes deux solutions, j'ai bien pris soin d'utiliser "include
" uniquement lorsqu'il était vraiment nécessaire.
Revenir aux mises au point