Differenza tra "includi" e "richiedi" in php


174

C'è qualche differenza tra loro? Usarli è una questione di preferenza? L'uso l'uno rispetto all'altro produce dei vantaggi? Quale è meglio per la sicurezza?



3
Usa sempre "richiedi". "include" è conveniente come una porta elettrica in una sauna.
Marco Mariani,

2
@MarcoMariani Come sarebbe scomodo? Probabilmente è chiaro, non lo vedo. Forse il vapore?
Austin Burk,

Per dirla semplicemente, se un file 'foo.php' manca per errore, voglio sapere al più presto, non quando verrà chiamata una funzione che avrebbe dovuto essere in foo.php. Sostituire include con requisito spesso può rivelare bug. Diciamo che manca config.php e l'applicazione è in esecuzione con una configurazione predefinita. Quale è meglio per la sicurezza? Per quanto riguarda la sauna, quando sono dentro e la porta non si apre per qualche motivo, non mi piace.
Marco Mariani,

Risposte:


148

Le differenze sono spiegate nel manuale dettagliato di PHP nella pagina direquire :

requireè identico a includemeno che in caso di fallimento produrrà anche un E_COMPILE_ERRORerrore di livello fatale . In altre parole, interromperà lo script mentre include include solo un avviso ( E_WARNING) che consente allo script di continuare.

Vedi la risposta di @efritz per un esempio


6
tiposaurus.co.uk/2011/04/04/… "La differenza chiave tra require () e include () è che se si richiede () un file che non può essere caricato (es. se non è lì) allora genera un errore fatale che interromperà completamente l'esecuzione della pagina e non verrà generato più output. D'altra parte, se si include () un file che non può essere caricato, questo genererà semplicemente un avviso e continua a costruire la pagina ".
Stormwild,

3
"Quello che dovresti usare dipende dalla situazione; request () è più adatto per il caricamento di file che sono essenziali per il resto della pagina - ad esempio se hai un sito web guidato da database quindi usa un requisito () per includere un file contenente l'accesso al database e la password sono chiaramente preferiti all'utilizzo di include (). Se si utilizza include () in questa situazione, è possibile generare più avvisi ed errori di quanto si fosse previsto. "
Stormwild,

3
<?php if (isset($flibbertygibbet)) require 'file.php';sembrerebbe rendere questa risposta totalmente errata. Altrimenti, dovrei ricevere un errore fatale anche se la condizione non è vera. stracenon mostra PHP nemmeno provando a toccare file.php.
cHao,

A differenza di include (), request () leggerà sempre nel file di destinazione, anche se la riga su cui è attiva non viene mai eseguita. Se si desidera includere in modo condizionale un file, utilizzare include (). E Tuttavia, se la riga su cui si trova il requisito () non viene eseguita, nessuno dei codici nel file di destinazione verrà eseguito. Sembra dire la cosa opposta o sto fraintendendo?
lor

1
Tutti questi commenti si riferiscono alla versione originale di questa risposta prima che fosse modificata. Inizialmente c'era un reclamo non valido, che sosteneva che if (false) require 'file.php';avrebbe caricato (ma non eseguito) 'file.php'. TLDR ignora tutti questi commenti.
Kevin Wheeler,


5

Usa includese non ti dispiace che lo script continui senza caricare il file (nel caso in cui non esista ecc.) E puoi (anche se non dovresti) vivere con un messaggio di errore di avviso visualizzato.

Utilizzando requiresignifica che lo script si arresterà se non è in grado di caricare il file specificato e genererà un errore irreversibile.


2

Come altri hanno sottolineato, l'unica differenza è che richiede un errore fatale e include - un avviso catchable. Per quanto riguarda quale utilizzare, il mio consiglio è di attenersi a includere. Perché? perché puoi ricevere un avviso e generare un feedback significativo per gli utenti finali. Tener conto di

  // 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: per esempio 2 per funzionare è necessario installare un gestore errori-eccezioni, come descritto qui 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");   

A livello di inclusione non è un ottimo posto per imparare che il file che ti aspetti non è lì. Nessuno dei due problemi nel tuo esempio è quello di estromettere i visualizzatori del tuo sito web.
Kzqai,

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

Un esempio pratico molto semplice con il codice. Verrà visualizzata la prima eco. Non importa che usi includa o richieda perché le sue esecuzioni prima includono o obbligano.

Per verificare il risultato, nella seconda riga di un codice fornire intenzionalmente il percorso errato al file o commettere errori nel nome del file. Pertanto, la seconda eco da visualizzare o meno dipenderà totalmente dal fatto che si usi o richieda l' inclusione .

Se usi richiedi la seconda eco non verrà eseguita, ma se usi includi non importa quale errore arriva vedrai anche il risultato della seconda eco.


-2

Nel caso in cui il programma Includi non si interrompa e visualizzi un avviso sul browser, D'altra parte il programma Richiedi verrà chiuso e verrà visualizzato un errore irreversibile in caso di file non trovato.


Hai davvero dovuto rispondere a una domanda di 2 anni e mezzo per ripetere quali 2/3 delle risposte hanno già detto ...?
cao

4
Aww, è un principiante! Probabilmente non capisce ancora il concetto di SO.
Dan Hanly,

povero user2069222, ora ha lasciato SO: '(
Gagantous
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.