Hébergement du site en PHP et Mysql par WDMédia-hébergement
Vous aussi adpotez les éléPHPants de Vincent Pontier !  
CONCOURS
 
 
PLUS DE PHP
 
 
PLUS DE JAVASCRIPT
 
COMMENT CA MARCHE
 
 
EXPLIQUE-MOI
 
 
NEWS LETTER
 

 
PARTENAIRES
 
Découvrez scriptsphp.org
Découvrez phpteam.net
Tout sur les expressions régulières
IE sucks :-)
 
DESIGN DU SITE
 
Require ou include ?

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



Ajouter une réponse
Nom
Email
Titre

Mise en forme : gras = [b]...[/b], italic = [i]...[/i], souligné = [u]...[/u], citation = [quote]...[/quote], lien = [url]liens_externe[/url] ou [url nom=texte]liens_externe[/url], code source : [code]...[/code]

Mémoriser mon nom et mon email : Oui Non
www.phpdebutant.org © 2017 - L'équipe de phpDebutant - Hébergement : WDMédia-hébergement
DEBUTEZ !
 
  0.  Introduction
  1.  Afficher une phrase ou une image
  2.  Afficher la date et l'heure
  3.  PHP dans du code HTML
  4.  La concaténation
  5.  Récupérer les valeurs d'un formulaire
  6.  Les structures de contrôle
  7.  Ecrire et lire dans un fichier texte
  8.  Les fonctions utilisateurs
  9.  Les variables d'environnement
  10.  Quelques fonctions utiles
  11.  SQL/MySQL (Create, Alter & Drop)
  12.  SQL/MySQL (Insert et Select)
  13.  SQL/MySQL (Delete et Update)
  14.  SQL/MySQL (Where)
  15.  Fonctions PHP pour mySQL
  16.  Interroger une table MySQL
  17.  Alimenter une ou plusieurs tables mySQL
  18.  Les pseudos-frames
  19.  Les sessions php4
  20.  Affichage page par page
  21.  Images dynamiques
  22.  Ca marche pas ?
  23.  Variables globales à OFF
  24.  Les variables dynamiques