it-swarm.com.de

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

Wie prüft man, ob ein include/requir_once existiert, bevor man es aufruft? Ich habe versucht, es in einen Fehlerblock zu setzen, aber PHP hat das nicht gefallen.

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

Gibt es noch andere Möglichkeiten?

41
Smickie

Ich glaube, dass file_exists mit relativen Pfaden funktioniert, obwohl Sie auch etwas in diese Richtung versuchen könnten ...

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

... Sie können selbstverständlich die Ausnahme durch eine von Ihnen gewählte Fehlerbehandlungsmethode ersetzen. Die Idee dabei ist, dass die Anweisung if- überprüft, ob die Datei eingeschlossen werden kann, und dass alle Fehlermeldungen, die normalerweise von include ausgegeben werden, durch das Präfixieren von @ unterdrückt werden.

56
Johannes Gorset

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

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

9
Stephane JAIS

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

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

OR

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

OR

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

file_exists würde prüfen, ob die erforderliche Datei vorhanden ist, wenn sie relativ zum aktuellen Arbeitsverzeichnis ist, da sie relativ gut für relative Pfade ist. Wenn sich die Include-Datei jedoch an anderer Stelle auf PATH befindet, müssen 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;
}
6
Yacoby

file_exists() arbeitet mit relativen Pfaden und prüft auch, ob Verzeichnisse vorhanden sind. Verwenden Sie stattdessen is_file():

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

Ich denke, der richtige Weg ist zu tun:

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

Dies liegt daran, dass die Dokumentation besagt, dass stream_resolve_include_path den "Dateinamen gegen den Include-Pfad nach denselben Regeln wie fopen ()/include auflöst."

Einige Leute haben die Verwendung von is_file oder is_readable vorgeschlagen, aber ist nicht für den allgemeinen Anwendungsfall gedacht, da bei der allgemeinen Verwendung die Datei blockiert wird oder aus irgendeinem Grund nicht verfügbar ist, nachdem file_exists den Wert TRUE zurückgibt mit einer sehr hässlichen Fehlermeldung direkt auf dem Gesicht des Endbenutzers oder auf andere Weise sind Sie offen für unerwartetes und unerklärliches Verhalten mit möglichem Verlust von Daten und dergleichen.

0
jacmkno