2010-02-12 27 views
35

Come si controlla se esiste una include/require_once prima di chiamarla, ho provato a inserirla in un blocco di errore, ma a PHP non piaceva.Verifica se esiste una inclusione (o richiesta)

Penso che il file_exists() funzionerebbe con un certo sforzo, tuttavia ciò richiederebbe l'intero percorso del file, e una inclusione relativa non potrebbe essere passata facilmente in essa.

Ci sono altri modi?

+1

puoi mostrarci qualche codice? puoi sostanzialmente spiegare cosa stai cercando di fare? – JPro

+1

@GZipp: ** A tutti coloro che suggeriscono l'uso di 'file_exists()': ** * controlla se esiste un file ** o una directory ** *. 'is_file()' sarebbe una soluzione migliore in questo caso. –

+1

@Alix Axel: A tutti voi che mi state rivolgendo: non stavo suggerendo nient'altro che l'assunto di Smickie (che un percorso relativo non può essere facilmente trasformato in un percorso completo) era sbagliato. Altri hanno sottolineato che il percorso completo non è necessario; quindi il mio commento piuttosto che la risposta. – GZipp

risposta

47

Credo file_exists funziona con i percorsi relativi, anche se si potrebbe anche provare qualcosa in queste righe ...

if([email protected]("script.php")) throw new Exception("Failed to include 'script.php'");

... Inutile dire, si può sostituire l'eccezione per la gestione degli errori metodo di tua scelta. L'idea qui è che l'informazione if verifica se il file può essere incluso e qualsiasi messaggio di errore normalmente emesso da include viene soppresso anteponendolo con @.

+4

esiste con i percorsi relativi ai parenti –

+2

Non è necessaria la parentesi attorno al valore dell'argomento di include. 'include' non è una funzione ma un costrutto di linguaggio come' echo'. – Gumbo

+5

@Gumbo Considero una buona pratica usare le paran- tesi per i costrutti del linguaggio, proprio come faccio con 'echo()' e 'print()'. –

6

file_exists funzionerebbe con il controllo se il file richiesto esiste quando è relativo alla directory di lavoro corrente come funziona bene con percorsi relativi. Tuttavia, se il file di inclusione era altrove su PATH, dovresti controllare diversi percorsi.

+1

file_exists non può cercare nei percorsi di inclusione. Dovresti analizzarli manualmente. –

+0

@Petr grazie per averlo indicato, risolto. – Yacoby

+1

PS == PATH_SEPARATOR && DS == DIRECTORY_SEPARATOR per chi si chiede, +1, sperando che tu lo aggiusti, questo funziona alla grande e senza sovraccarico di eccezioni ed errori manipoli – mschr

4

file_exists() funziona con percorsi relativi, controllerà anche se esistono le directory. Utilizzare is_file() invece:

if (is_file('./path/to/your/file.php')) 
{ 
    require_once('./path/to/your/file.php'); 
} 
+0

Mentre funziona con percorsi relativi, non funziona con i percorsi di inclusione - - Qualcosa da notare;) –

7

Si può anche verificare la presenza di eventuali variabili, funzioni o classi definite nel file di inclusione e vedere se il includono lavorato.

if (isset($variable)) { /*code*/ } 

O

if (function_exists('function_name')) { /*code*/ } 

O

if (class_exists('class_name')) { /*code*/ } 
+0

il problema qui è che se l'inclusione non funzionerà in primo luogo - genererà e errore/avvertimento .. –

0

Penso che il modo corretto è quello di fare:

if(file_exists(stream_resolve_include_path($filepath))){ 
    include $filepath;  
} 

Questo perché the documentation dice che stream_resolve_include_path risolve il "nome del file contro il percorso di inclusione secondo le stesse regole fopen()/includere."

Alcune persone hanno suggerito di usare is_file o is_readable ma thats non per il caso uso generale perché in uso generale, se il file è bloccato o non disponibile per qualche motivo dopo file_exists restituisce TRUE, thats qualcosa che è necessario da notare con un brutto messaggio di errore proprio sul volto dell'utente finale o altrimenti si è aperti a comportamenti inaspettati e inesplicabili in seguito con possibile perdita di dati e cose del genere.