web-dev-qa-db-ja.com

include(またはrequire)が存在するかどうかを確認します

呼び出す前にinclude/require_onceが存在するかどうかをどのように確認しますか、エラーブロックに入れようとしましたが、PHPは気に入らなかった。

file_exists()はある程度の努力で機能すると思いますが、ファイルパス全体が必要になり、相対インクルードを簡単に渡すことができませんでした。

他の方法はありますか?

42
MintDeparture

_file_exists_は相対パスで機能すると信じていますが、これらの線に沿って何かを試すこともできます...

if(!@include("script.php")) throw new Exception("Failed to include 'script.php'");

...言うまでもなく、選択したエラー処理方法の代わりに例外を使用できます。ここでの考え方は、if-ステートメントがファイルを含めることができるかどうかを検証し、includeが通常出力するエラーメッセージは、_@_を前に付けることで抑制されるということです。

56
Johannes Gorset

Stream_resolve_include_path関数をチェックしてください。include()と同じルールで検索します。

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

9
Stephane JAIS

また、インクルードファイルで定義されている変数、関数、またはクラスをチェックし、インクルードが機能しているかどうかを確認できます。

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

OR

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

OR

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

file_existsは、相対パスで正常に動作するため、必要なファイルが現在の作業ディレクトリに相対的である場合に、必要なファイルが存在するかどうかをチェックして動作します。ただし、インクルードファイルがPATHの他の場所にある場合は、いくつかのパスを確認する必要があります。

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()は相対パスで機能し、ディレクトリが存在するかどうかもチェックします。代わりにis_file()を使用してください:

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

私は正しい方法だと思います:

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

これは、 ドキュメントstream_resolve_include_pathは、「fopen()/ includeと同じ規則に従って、インクルードパスに対するファイル名」を解決します。

一部の人々は、is_fileまたはis_readableしかしそれは一般的な使用例ではありません。一般的な使用では、file_existsがTRUEを返した後に何らかの理由でファイルがブロックされたり利用できない場合、最後のユーザーの顔に非常にerrorいエラーメッセージが表示されていることに気付く必要があります。さもなければ、データやそのようなものが失われる可能性のある予期せぬ不可解な動作を受け入れることになります。

0
jacmkno