2010-02-12 29 views
35

Jak sprawdzić, czy plik include/require_once istnieje przed wywołaniem go, próbowałem umieścić go w bloku błędu, ale PHP tego nie lubił.Sprawdź, czy istnieje uwzględnienie (lub wymaganie)

Wydaje mi się, że przy pewnym wysiłku wymagałoby to całej ścieżki pliku, a względne uwzględnienie nie mogło być łatwo przekazane.

Czy istnieją inne sposoby?

+1

czy możesz pokazać nam kod? czy możesz zasadniczo wyjaśnić, co próbujesz zrobić? – JPro

+1

@GZipp: ** Wszystkim, którzy sugerują użycie 'file_exists()': ** * sprawdza, czy istnieje plik ** lub katalog ** *. 'is_file()' byłoby lepszym rozwiązaniem w tym przypadku. –

+1

@Alix Axel: Do wszystkich, którzy zwracają się do mnie: sugerowałem tylko, że założenie Smickiego (że względna ścieżka nie może być łatwo przekształcona na pełną ścieżkę) było złe. Inni zwrócili uwagę, że pełna ścieżka nie jest konieczna; stąd mój komentarz, a nie odpowiedź. – GZipp

Odpowiedz

47

wierzę file_exists działa na relatywnych ścieżek, choć można też spróbować czegoś wzdłuż tych linii ...

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

... trzeba powiedzieć, można zastąpić wyjątku dla każdego obsługi błędów wybraną metodą. Pomysł polega na tym, że w pliku if sprawdza się, czy plik może zostać dołączony, a wszelkie komunikaty o błędach zwykle wyprowadzane przez include są pomijane przez prefiksowanie go na @.

+4

plik istnieje działa ze ścieżkami dla krewnych –

+2

Nie potrzebujesz nawiasów wokół wartości argumentu 'include'. 'include' nie jest funkcją, ale konstrukcją językową podobną do' echo'. – Gumbo

+5

@Gumbo Uważam, że dobrą praktyką jest używanie paranthezy dla konstrukcji językowych, podobnie jak robię to z 'echo()' i 'print()'. –

6

file_exists będzie działać ze sprawdzaniem, czy wymagany plik istnieje, jeśli jest względny w stosunku do bieżącego katalogu roboczego, ponieważ działa poprawnie ze względnymi ścieżkami. Jeśli jednak plik dołączający znajduje się w innym miejscu na ścieżce PATH, należy sprawdzić kilka ścieżek.

function include_exists ($fileName){ 
    if (realpath($fileName) == $fileName) { 
     return is_file($fileName); 
    } 
    if (is_file($fileName)){ 
     return true; 
    } 

    $paths = explode(PS, get_include_path()); 
    foreach ($paths as $path) { 
     $rp = substr($path, -1) == DS ? $path.$fileName : $path.DS.$fileName; 
     if (is_file($rp)) { 
      return true; 
     } 
    } 
    return false; 
} 
+1

file_exists nie mogą wyszukiwać w ścieżkach dołączania. Musiałbyś przeanalizować je ręcznie. –

+0

@Petr dzięki za wskazanie tego, naprawione. – Yacoby

+1

PS == PATH_SEPARATOR && DS == DIRECTORY_SEPARATOR dla tych, którzy zastanawiają się, +1, mając nadzieję, że to naprawisz, działa to świetnie i bez narzutów obsługi wyjątków i błędów – mschr

4

file_exists() działa ze ścieżkami względnymi, sprawdza również, czy istnieją katalogi. Użyj is_file() zamiast:

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

Działa ze ścieżkami względnymi, ale nie działa ze ścieżkami dołączania - - coś do zapamiętania;) –

7

Można również sprawdzić żadnych zmiennych, funkcji lub klas zdefiniowanych w pliku include i sprawdzić, czy należą pracował.

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

LUB

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

LUB

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

Problem polega na tym, że jeśli lista nie zadziała w pierwszej kolejności - wyświetli się komunikat o błędzie/ostrzeżeniu. –

0

myślę poprawny sposób to zrobić:

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

To dlatego the documentation mówi, że stream_resolve_include_path rozwiązuje „pliku przeciwko zawierać ścieżkę według tych samych zasad jak fopen()/zawierać."

Niektórzy sugerują, używając is_file lub is_readable ale that's nie dla ogólnego przypadku użycia ponieważ w powszechnym użyciu, jeśli plik jest zablokowany lub brak jakiegoś powodu po file_exists zwraca TRUE, that's czegoś trzeba zauważyć z bardzo brzydkim komunikatem o błędzie bezpośrednio na twarzy użytkownika końcowego lub w inny sposób jesteś otwarty na nieoczekiwane i niewytłumaczalne zachowanie później z możliwą utratą danych i tym podobnych.