Überprüfen Sie, ob ein Include (oder Require) vorhanden ist

Lesezeit: 5 Minuten

Benutzer-Avatar
CaféHey

Wie überprüfen Sie, ob ein include / require_once existiert, bevor Sie es aufrufen? Ich habe versucht, es in einen Fehlerblock einzufügen, aber PHP hat das nicht gefallen.

Ich finde file_exists() würde zwar mit einigem Aufwand funktionieren, aber das würde den gesamten Dateipfad erfordern, und ein relatives Include könnte nicht einfach darin übergeben werden.

Gibt es noch andere Möglichkeiten?

  • kannst du uns einen Code zeigen? kannst du im Grunde erklären, was du vorhast?

    – JPro

    12. Februar 2010 um 15:00 Uhr


  • @GZipp: An alle, die die Verwendung von vorschlagen file_exists(): überprüft, ob eine Datei oder Verzeichnis existiert. is_file() würde in diesem Fall besser passen.

    – Alix Axel

    12. Februar 2010 um 15:22 Uhr


  • @Alix Axel: An alle, die mich ansprechen: Ich habe nichts anderes vorgeschlagen, als 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 Pfad nicht erforderlich ist; daher eher mein Kommentar als Antwort.

    – GZipp

    12. Februar 2010 um 15:43 Uhr


  • @Alix: is_file() ist besser als file_exists() aber ist es nicht noch besser zu bedienen is_readable()?

    – Agentenrätsel

    24. November 2010 um 7:47 Uhr

  • @AgentConundrum: is_readable(): “Gibt TRUE zurück, wenn die Datei oder Verzeichnis angegeben durch filename existiert und ist lesbar, andernfalls FALSE”.

    – Alix Axel

    24. November 2010 um 12:05 Uhr

Benutzer-Avatar
Johannes Gorset

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

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

… natürlich können Sie die Ausnahme durch eine beliebige Fehlerbehandlungsmethode Ihrer Wahl ersetzen. Die Idee hier ist, dass die if-statement überprüft, ob die Datei eingebunden werden konnte, und eventuelle Fehlermeldungen, die normalerweise von ausgegeben werden include wird durch vorangestelltes unterdrückt @.

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

    – Gumbo

    12. Februar 2010 um 15:17 Uhr

  • @Gumbo Ich halte es für eine gute Praxis, Klammern für Sprachkonstrukte zu verwenden, ähnlich wie ich es tue echo() und print() auch.

    – Johannes Gorset

    12. Februar 2010 um 15:24 Uhr


  • Ich bin mir nicht sicher, ob dies eine gute Lösung ist: Sie werden keine schwerwiegenden Fehler sehen.

    – Michal Maluga

    23. August 2011 um 12:50 Uhr

  • @Michal Malunga: Ich bin mir nicht sicher, ob du die Frage verstehst.

    – Johannes Gorset

    24. August 2011 um 8:54 Uhr


  • Es ist besser zu verwenden include_once oder require_once dies wird bei der Verwendung hilfreich sein OOP Konzept und Vermeidung der erneuten Deklaration von Klassen.

    – Raffee

    23. August 2012 um 15:03 Uhr

Schauen Sie sich die Funktion stream_resolve_include_path an, sie sucht mit den gleichen Regeln wie include().

http://php.net/manual/en/function.stream-resolve-include-path.php

  • Ein paar von Benutzern beigesteuerte Anmerkungen hier: stream_resolve_include_path() scheint seine Ausgabe zwischenzuspeichern. Nachdem ich eine Datei umbenannt hatte, musste ich Apache neu starten, damit stream_resolve_include_path() keinen nicht vorhandenen Dateinamen zurückgab. Dies war unter Windows. Es verhält sich wirklich wie include und löst den Dateinamen nur gegen den Include-Pfad auf, wenn der Pfad relativ ist. Es macht ohnehin wenig Sinn, bereits absolute Pfadnamen aufzulösen.

    – RationalRabbit

    7. Mai 2019 um 1:41 Uhr

Sie können auch nach Variablen, Funktionen oder Klassen suchen, die in der Include-Datei definiert sind, und sehen, ob das Include funktioniert hat.

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

ODER

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

ODER

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

  • Das Problem hier ist, dass, wenn das Include überhaupt nicht funktioniert, es einen Fehler / eine Warnung auslöst.

    – Obmerk Kronen

    25. Februar 2014 um 3:48 Uhr

file_exists() arbeitet mit relativen Pfaden, es wird auch geprüft, ob Verzeichnisse existieren. Verwenden is_file() stattdessen:

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

Benutzer-Avatar
Yacoby

file_exists würde mit der Überprüfung funktionieren, ob die erforderliche Datei existiert, wenn sie relativ zum aktuellen Arbeitsverzeichnis ist, da es mit relativen Pfaden gut funktioniert. Wenn sich die Include-Datei jedoch an einer anderen Stelle auf PATH befände, müssten Sie mehrere Pfade überprüfen.

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;
}

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

    – Peter Peller

    12. Februar 2010 um 15:06 Uhr


  • PS == PATH_SEPARATOR && DS == DIRECTORY_SEPARATOR für diejenigen, die sich fragen, +1, in der Hoffnung, dass Sie es beheben würden, das funktioniert großartig und ohne Overhead von Ausnahme- und Fehlerbehandlungen

    – mschr

    16. Juli 2012 um 10:18 Uhr

Benutzer-Avatar
jacmkno

Ich denke, der richtige Weg ist zu tun:

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

Das ist weil die Dokumentation sagt, dass stream_resolve_include_path löst den “Dateinamen gegen den Include-Pfad nach den gleichen Regeln wie fopen()/include auf.”

Einige Leute schlugen vor, zu verwenden is_file oder is_readable aber das ist nicht für den allgemeinen Anwendungsfall Denn wenn die Datei im allgemeinen Gebrauch blockiert oder aus irgendeinem Grund nicht verfügbar ist, nachdem file_exists TRUE zurückgibt, müssen Sie dies mit einer sehr hässlichen Fehlermeldung direkt im Gesicht des Endbenutzers bemerken, sonst sind Sie offen für Unerwartetes und später unerklärliches Verhalten mit möglichem Datenverlust und dergleichen.

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

    – Peter Peller

    12. Februar 2010 um 15:06 Uhr


  • PS == PATH_SEPARATOR && DS == DIRECTORY_SEPARATOR für diejenigen, die sich fragen, +1, in der Hoffnung, dass Sie es beheben würden, das funktioniert großartig und ohne Overhead von Ausnahme- und Fehlerbehandlungen

    – mschr

    16. Juli 2012 um 10:18 Uhr

1312260cookie-checkÜberprüfen Sie, ob ein Include (oder Require) vorhanden ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy