web-dev-qa-db-fra.com

Vérifier s'il existe une inclusion (ou une exigence)

Comment vérifier si un include/require_once existe avant de l'appeler, j'ai essayé de le mettre dans un bloc d'erreur, mais PHP n'a pas aimé.

Je pense que file_exists() fonctionnerait avec un certain effort, mais cela nécessiterait le chemin d'accès complet du fichier, et une inclusion relative ne pourrait pas être passée facilement.

Y a-t-il d'autres moyens?

41
Smickie

Découvrez la fonction stream_resolve_include_path, Elle effectue la recherche avec les mêmes règles que include ().

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

9
Stephane JAIS

Vous pouvez également rechercher les variables, fonctions ou classes définies dans le fichier d'inclusion et voir si l'inclusion fonctionne.

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

OR

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

OR

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

file_exists fonctionnerait avec la vérification de l'existence du fichier requis lorsqu'il est relatif au répertoire de travail actuel, car il fonctionne correctement avec des chemins relatifs. Toutefois, si le fichier d'inclusion se trouvait ailleurs sur PATH, vous devrez vérifier plusieurs chemins.

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() fonctionne avec des chemins relatifs, il va également vérifier si des répertoires existent. Utilisez is_file() à la place:

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

Je pense que la bonne façon est de faire:

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

Cela est dû au fait que la documentation indique que stream_resolve_include_path résout le "nom de fichier par rapport au chemin d’inclusion selon les mêmes règles que fopen ()/include".

Certaines personnes ont suggéré d'utiliser is_file ou is_readable mais ce n'est pas dans le cas d'une utilisation générale car, dans son usage général, si le fichier est bloqué ou indisponible pour une raison quelconque après que file_exists ait renvoyé la valeur TRUE, il faut le remarquer. avec un message d’erreur très laid sur le visage de l’utilisateur final ou vous êtes par la suite ouvert à un comportement inattendu et inexplicable avec une possible perte de données, etc.

0
jacmkno