2010-02-12 22 views
35

Wie überprüfen Sie, ob ein include/require_once existiert, bevor Sie es aufrufen, ich habe versucht, es in einen Fehlerblock zu setzen, aber PHP hat das nicht gefallen.Überprüfen, ob ein include (oder require) existiert

Ich denke, file_exists() würde mit etwas Aufwand arbeiten, aber das würde den gesamten Dateipfad erfordern, und ein relatives Include konnte nicht einfach in es übergeben werden.

Gibt es noch andere Möglichkeiten?

+1

können Sie uns Code zeigen? Kannst du im Grunde erklären, was du zu tun versuchst? – JPro

+1

@GZipp: ** An alle, die die Verwendung von 'file_exists()' vorschlagen: ** * prüft, ob eine Datei ** oder ein Verzeichnis ** existiert *. 'is_file()' wäre in diesem Fall besser geeignet. –

+1

@Alix Axel: An alle von Ihnen, die mich ansprechen: Ich habe nur angedeutet, dass Smickies Annahme (dass ein relativer Pfad nicht einfach in einen vollständigen Pfad umgewandelt werden kann) falsch war. Andere haben darauf hingewiesen, dass der vollständige Weg nicht notwendig ist; daher mein Kommentar eher als Antwort. – GZipp

Antwort

47

Ich glaube file_exists mit relativen Pfaden funktioniert, obwohl Sie auch etwas in dieser Richtung versuchen könnte ...

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

... unnötig zu sagen, Sie wird für jeden Fehlerbehandlung kann ersetzen Methode Ihrer Wahl. Die Idee hier ist, dass die if -Statement überprüft, ob die Datei enthalten sein könnte, und alle Fehlermeldungen, die normalerweise von include ausgegeben werden, wird durch vorangestellt mit @ unterdrückt.

+4

Datei existiert mit verwandten Pfaden –

+2

Sie brauchen die Klammern um den Argumentwert von 'include' nicht. 'include' ist keine Funktion, sondern ein Sprachkonstrukt wie' echo'. – Gumbo

+5

@Gumbo Ich halte es für eine gute Übung, Klammern für Sprachkonstrukte zu verwenden, ähnlich wie bei 'echo()' und 'print()'. –

6

file_exists würde mit überprüfen, ob die erforderliche Datei vorhanden ist, wenn es relativ zu dem aktuellen Arbeitsverzeichnis ist, wie es mit relativen Pfaden funktioniert. Wenn sich die Include-Datei jedoch an einer anderen Stelle in PATH befindet, müssen Sie mehrere Pfade überprüfen.

+1

file_exists kann nicht in den Include-Pfaden suchen. Sie müssten sie manuell analysieren. –

+0

@Petr Danke, dass du das aufzeigst, behoben. – Yacoby

+1

PS == PATH_SEPARATOR && DS == DIRECTORY_SEPARATOR für diejenigen, die sich wundern, +1, hoffe, Sie würden es beheben, das funktioniert großartig und ohne Overhead von Ausnahme und Fehler Handlings – mschr

4

file_exists() arbeitet mit relativen Pfaden, es wird auch prüfen, ob Verzeichnisse existieren. Verwenden Sie is_file() statt:

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

Während es mit relativen Pfaden funktioniert, funktioniert es nicht mit Include-Pfaden - - etwas zu beachten;) –

7

Sie können auch überprüfen, für alle Variablen, Funktionen oder in der Datei enthalten definierte Klassen und sehen, ob das funktioniert, umfassen.

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

ODER

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

ODER

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

das Problem hier ist, dass, wenn das Include wird nicht in erster Linie funktionieren - es wird werfen und Fehler/Warnung .. –

0

ich glaube, die richtige Art und Weise zu tun ist:

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

Dies liegt daran, the documentation sagt, dass stream_resolve_include_path die „Dateinamen gegen den Pfad nach den gleichen Regeln wie fopen umfassen löst()/einschließen."

Einige Leute vorgeschlagen mit is_file oder is_readable aber das ist nicht für den allgemeinen Gebrauch Fall weil im allgemeinen Gebrauch, wenn die Datei aus irgendeinem Grund nach file_exists oder nicht verfügbar ist blockiert liefert TRUE, das ist etwas, was Sie brauchen mit einer sehr hässlichen Fehlermeldung direkt auf dem Gesicht des Endnutzers zu bemerken oder sonst sind Sie offen für unerwartetes und unerklärliches Verhalten später mit möglichem Verlust von Daten und dergleichen.

Verwandte Themen