include 'header.php'; exécute le code d'un autre fichier PHP à cet endroit du script, comme s'il y était collé. require 'header.php'; fait la même chose, mais si le fichier ne peut pas être chargé, require arrête le script avec une erreur fatale alors qu'include affiche seulement un warning et continue. Le premier usage habituel est un en-tête et un pied de page partagés par toutes les pages.
Le bloc écrit d'abord header.php et footer.php, pour qu'il y ait des fichiers à inclure. Exécutez-le et regardez l'onglet Page :
Les fichiers inclus sont des fichiers PHP ordinaires : ils peuvent contenir du HTML avec des balises <?= ?>, et ils voient la variable $title définie avant le require. Modifiez le titre et relancez ; chaque page qui requiert l'en-tête prendrait en compte une modification de ce seul fichier.
include ou require
La seule différence est ce qui se passe quand le fichier manque ou est illisible. include affiche deux warnings, vaut false, et le script continue :
Warning: include(sidebar.php): Failed to open stream: No such file or directory in /home/index.php on line 2
Warning: include(): Failed opening 'sidebar.php' for inclusion (include_path='.:/usr/share/php83') in /home/index.php on line 2
require affiche le même warning puis lève une Error, qui termine le script sauf si quelque chose l'intercepte :
PHP Warning: require(config.php): Failed to open stream: No such file or directory in /home/index.php on line 2
PHP Fatal error: Uncaught Error: Failed opening required 'config.php' (include_path='.:/usr/share/php83') in /home/index.php:2
Utilisez donc require pour tout ce sans quoi la page ne peut pas s'exécuter (configuration, bibliothèques de fonctions, fichiers de classes) et include pour les parties facultatives. Pour une partie qui peut légitimement manquer, vérifiez-la d'abord au lieu de compter sur le warning :
Sortie :
Spring sale: 20% off
banner.php included, include returned int(1)
sidebar.php not found, skipped
include_once et require_once
Un fichier qui définit une fonction ou une classe ne peut être chargé qu'une fois : le charger une seconde fois est une erreur fatale, car la fonction existe déjà.
Fatal error: Cannot redeclare greet() (previously declared in /home/helpers.php:2) in /home/helpers.php on line 2
Cela arrive dès que deux fichiers font chacun require 'helpers.php'. require_once et include_once se souviennent des fichiers déjà chargés et les sautent la seconde fois, en renvoyant true :
Sortie :
int(1)
bool(true)
bool(true)
Hello, Ada
Utilisez les formes _once pour les fichiers qui déclarent des choses, et un simple include pour les templates que vous voulez afficher plus d'une fois. Dans les projets qui utilisent Composer, l'autoloader charge les fichiers de classes pour vous, donc les appels require_once pour les classes disparaissent en grande partie ; voir Composer.
Renvoyer une valeur depuis un fichier inclus
Un return au niveau principal d'un fichier inclus arrête ce fichier et rend une valeur à l'expression include ou require. Cela donne un fichier de configuration propre : pas de variables globales, juste une valeur que vous affectez au nom de votre choix.
Sortie :
My Shop
shop
bool(false)
Les fichiers de configuration de Laravel (config/app.php, config/database.php et les autres) fonctionnent ainsi.
Variables et portée dans les fichiers inclus
Le code inclus s'exécute dans la portée de la ligne qui l'inclut. En haut d'un script, il voit toutes les variables globales ; dans une fonction, il ne voit que les variables locales de cette fonction. Cette seconde règle est le principe d'un petit moteur de templates : une fonction dont les variables locales sont exactement celles que le template doit voir.
L'onglet Page affiche les deux listes, rendues à partir d'un seul fichier de template. Comme include s'exécute dans render(), le template voit $heading et $products mais pas $secret. La forme foreach ... endforeach utilisée dans le template est la syntaxe alternative que PHP propose pour les templates HTML.
Chemins d'inclusion et DIR
Un chemin comme 'helper.php' n'est pas résolu par rapport au fichier qui contient l'include. PHP cherche dans le réglage include_path (qui commence normalement par ., le dossier de travail courant) et seulement ensuite dans le dossier du fichier qui inclut. Donc dans partials/nav.php, include 'helper.php' peut charger un helper.php complètement différent situé à la racine du projet. __DIR__, le dossier du fichier courant, supprime toute incertitude :
Sortie :
loaded the root helper.php
loaded partials/helper.php
__DIR__ in nav.php is partials
Écrivez chaque include sous la forme __DIR__ . '/relative/path.php'. Le dossier de travail dépend de la façon dont le script a été lancé (le serveur web, une tâche cron, la ligne de commande depuis un autre dossier), mais __DIR__ ne change jamais.
Ne jamais inclure un fichier nommé par l'utilisateur
Un premier routeur courant lit le nom de la page dans l'URL : include $_GET['page'] . '.php';. Cela permet à un visiteur de choisir quel fichier du serveur s'exécute, par exemple ?page=../../config (inclusion de fichier local), et avec d'anciens réglages même un fichier d'un autre serveur. Associez plutôt des noms autorisés à des fichiers. Exécutez le bloc et cliquez sur les liens : chaque clic relance le script avec un $_GET['page'] différent.
Seuls les trois noms de $pages peuvent atteindre require ; le lien ../secret obtient la page « Not found ». La lecture sûre des valeurs de requête est expliquée dans _POST.
Questions fréquentes
Quelle est la différence entre include et require en PHP ?
Les deux chargent et exécutent un autre fichier PHP. Si le fichier ne peut pas être chargé, require arrête le script avec une erreur fatale, alors qu'include affiche un warning, renvoie false et laisse le script continuer. Utilisez require pour les fichiers sans lesquels la page ne peut pas fonctionner, comme la configuration et les bibliothèques de fonctions.
Quand utiliser require_once plutôt que require ?
Utilisez require_once pour les fichiers qui définissent des fonctions, des classes ou des constantes. Charger un tel fichier deux fois est une erreur fatale (Cannot redeclare), et require_once saute le fichier s'il a déjà été chargé. Les templates que vous voulez afficher plusieurs fois utilisent un simple include.
Un fichier PHP inclus peut-il renvoyer une valeur ?
Oui. Un return au niveau principal du fichier inclus le termine et devient la valeur de l'expression include ou require : $config = require 'config.php'; avec return ['debug' => true]; dans config.php. Sans return, include vaut 1.
Un fichier inclus a-t-il accès à mes variables ?
Oui. Le code inclus s'exécute dans la portée de la ligne qui l'inclut : en haut d'un script, il voit les variables globales, et dans une fonction il voit les variables locales de cette fonction et rien d'autre. Les variables qu'il crée arrivent dans cette même portée.
Faut-il écrire include('file.php') ou include 'file.php' ?
Les deux fonctionnent, car include et require sont des constructions du langage, pas des fonctions ; les parenthèses ne font qu'entourer le chemin. La plupart des guides de style écrivent require 'file.php'; sans elles.