呼び出す前にinclude/require_onceが存在するかどうかをどのように確認しますか、エラーブロックに入れようとしましたが、PHPは気に入らなかった。
file_exists()
はある程度の努力で機能すると思いますが、ファイルパス全体が必要になり、相対インクルードを簡単に渡すことができませんでした。
他の方法はありますか?
_file_exists
_は相対パスで機能すると信じていますが、これらの線に沿って何かを試すこともできます...
if(!@include("script.php")) throw new Exception("Failed to include 'script.php'");
...言うまでもなく、選択したエラー処理方法の代わりに例外を使用できます。ここでの考え方は、if
-ステートメントがファイルを含めることができるかどうかを検証し、include
が通常出力するエラーメッセージは、_@
_を前に付けることで抑制されるということです。
Stream_resolve_include_path関数をチェックしてください。include()と同じルールで検索します。
http://php.net/manual/en/function.stream-resolve-include-path.php
また、インクルードファイルで定義されている変数、関数、またはクラスをチェックし、インクルードが機能しているかどうかを確認できます。
if (isset($variable)) { /*code*/ }
OR
if (function_exists('function_name')) { /*code*/ }
OR
if (class_exists('class_name')) { /*code*/ }
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;
}
file_exists()
は相対パスで機能し、ディレクトリが存在するかどうかもチェックします。代わりにis_file()
を使用してください:
if (is_file('./path/to/your/file.php'))
{
require_once('./path/to/your/file.php');
}
私は正しい方法だと思います:
if(file_exists(stream_resolve_include_path($filepath))){
include $filepath;
}
これは、 ドキュメント がstream_resolve_include_path
は、「fopen()/ includeと同じ規則に従って、インクルードパスに対するファイル名」を解決します。
一部の人々は、is_file
またはis_readable
しかしそれは一般的な使用例ではありません。一般的な使用では、file_existsがTRUEを返した後に何らかの理由でファイルがブロックされたり利用できない場合、最後のユーザーの顔に非常にerrorいエラーメッセージが表示されていることに気付く必要があります。さもなければ、データやそのようなものが失われる可能性のある予期せぬ不可解な動作を受け入れることになります。