Différence entre "inclure" et "exiger" en PHP


174

Y a-t-il une différence entre eux? Leur utilisation est-elle une question de préférence? L'utilisation de l'un par rapport à l'autre présente-t-elle des avantages? Quel est le meilleur pour la sécurité?



3
Utilisez toujours "require". «inclure» est aussi pratique qu'une porte électrique dans un sauna.
Marco Mariani

2
@MarcoMariani En quoi cela serait-il gênant? C'est probablement clair, je ne le vois tout simplement pas. Peut-être la vapeur?
Austin Burk

Pour faire simple, si un fichier «foo.php» est manquant par erreur, je veux savoir le plus tôt possible, pas quand une fonction qui aurait dû être dans foo.php est appelée. Le remplacement de include par require peut souvent révéler des bogues. Disons que config.php est manquant et que l'application s'exécute avec une configuration par défaut. Quel est le meilleur pour la sécurité? Quant au sauna, quand je suis à l'intérieur et que la porte ne s'ouvre pas pour une raison quelconque, je n'aime pas ça.
Marco Mariani

Réponses:


148

Vous trouverez les différences expliquées dans le manuel PHP détaillé sur la page derequire :

requireest identique à includesauf en cas d'échec, il produira également une E_COMPILE_ERRORerreur de niveau fatale . En d'autres termes, il arrêtera le script alors que include n'émet qu'un avertissement ( E_WARNING) qui permet au script de continuer.

Voir la réponse de @ efritz pour un exemple


6
tiposaurus.co.uk/2011/04/04/… "La principale différence entre require () et include () est que si vous require () un fichier qui ne peut pas être chargé (par exemple s'il n'y est pas) alors il génère une erreur fatale qui arrêtera complètement l'exécution de la page, et aucune sortie ne sera générée. Par contre, si vous incluez () un fichier qui ne peut pas être chargé, cela générera simplement un avertissement et continuez à créer la page. "
stormwild

3
"Ce que vous devez utiliser dépend de la situation; require () est le mieux adapté pour charger des fichiers essentiels pour le reste de la page - par exemple si vous avez un site Web basé sur une base de données, utilisez require () pour inclure un fichier contenant le L'identifiant et le mot de passe de la base de données sont clairement préférés à l'utilisation de include (). Si vous avez utilisé include () dans cette situation, vous risquez de générer plus d'avertissements et d'erreurs que prévu. "
stormwild

3
<?php if (isset($flibbertygibbet)) require 'file.php';semblerait rendre cette réponse totalement incorrecte. Sinon, je devrais obtenir une erreur fatale même si la condition n'est pas vraie. stracene montre même pas que PHP essaie de toucher file.php.
cHao

Contrairement à include (), require () lira toujours le fichier cible, même si la ligne sur laquelle il se trouve ne s'exécute jamais. Si vous souhaitez inclure conditionnellement un fichier, utilisez include (). AND Cependant, si la ligne sur laquelle le require () se produit n'est pas exécutée, aucun des codes du fichier cible ne sera exécuté non plus. Semble dire le contraire, ou suis-je mal compris?
lorless

1
Tous ces commentaires font référence à la version originale de cette réponse avant sa modification. À l'origine, il y avait une réclamation invalide, affirmant que if (false) require 'file.php';cela entraînerait le chargement de 'file.php' (mais non exécuté). TLDR ne tient pas compte de tous ces commentaires.
Kevin Wheeler


5

À utiliser includesi cela ne vous dérange pas que votre script continue sans charger le fichier (au cas où il n'existe pas, etc.) et que vous pouvez (bien que vous ne devriez pas) vivre avec un message d'erreur d'avertissement affiché.

L'utilisation requiresignifie que votre script s'arrêtera s'il ne peut pas charger le fichier spécifié et génère une erreur fatale.


2

Comme d'autres l'ont souligné, la seule différence est que require jette une erreur fatale et inclut - un avertissement capturable. Quant à savoir lequel utiliser, mon conseil est de s'en tenir à l'inclure. Pourquoi? parce que vous pouvez attraper un avertissement et produire un retour significatif aux utilisateurs finaux. Considérer

  // Example 1.
  // users see a standard php error message or a blank screen
  // depending on your display_errors setting
  require 'not_there'; 


  // Example 2.
  // users see a meaningful error message
  try {
      include 'not_there';
  } catch(Exception $e) {
     echo "something strange happened!";
  }

NB: par exemple 2 pour fonctionner, vous devez installer un gestionnaire d'erreurs à exceptions, comme décrit ici http://www.php.net/manual/en/class.errorexception.php

  function exception_error_handler($errno, $errstr, $errfile, $errline ) {
     throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
  }
  set_error_handler("exception_error_handler");   

Au niveau de l'inclusion, ce n'est pas un bon endroit pour apprendre que le fichier que vous attendez n'est pas là. Aucun des problèmes de votre exemple n'est de pousser les visiteurs de votre site Web.
Kzqai

0
<?PHP
echo "Firstline";
include('classes/connection.php');
echo "I will run if include but not on Require";
?>

Un exemple pratique très simple avec du code. Le premier écho sera affiché. Peu importe que vous utilisiez include ou require, car il s'exécute avant include ou required.

Pour vérifier le résultat, dans la deuxième ligne d'un code, indiquez intentionnellement le mauvais chemin vers le fichier ou faites une erreur dans le nom du fichier. Ainsi, le second écho à afficher ou non dépendra totalement du fait que vous utilisiez require ou include .

Si vous utilisez require, le deuxième écho ne s'exécutera pas, mais si vous utilisez include, quelle que soit l'erreur qui survient, vous verrez également le résultat du deuxième écho.


-2

Dans le cas où le programme Inclure ne se terminera pas et affichera un avertissement sur le navigateur, D'autre part, le programme Require se terminera et affichera une erreur fatale en cas de fichier introuvable.


Avez-vous vraiment dû repousser une question de 2 ans et demi pour répéter ce que 2/3 des réponses ont déjà dit ...?
cHao

4
Aww, c'est un débutant! Ne comprend probablement pas encore le concept de SO.
Dan Hanly

pauvre utilisateur2069222, maintenant il a quitté SO: '(
Gagantous
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.