2011-12-04 40 views
4

パフォーマンス上の理由により、ファイルまたはディレクトリの存在を確認するときにrealpath() + file_exists()の代わりにrealpath()だけを使用する必要がありますか?php、realpathとrealpath + file_existsの使用

CASE A ::

if(realpath(__DIR__."/../file.php")===false) 

CASEのB ::

if(file_exists(realpath(__DIR__."/../file.php"))===false) 

iはCASE Aが仕事をすると思うし、CASE Bは、ジョブを2回行います。

答えて

7

だけでなく、ファイルが存在しない場合、それは少し愚かであり、ケースBの冗長(パスは解決できないか、ファイルがdocsごとに存在しない場合のrealpathがfalseを返すように)であります。

この文はFALSEを返しますので:

realpath(__DIR__."/../file.php"); 

この:

file_exists(realpath(__DIR__."/../file.php")); 

は本当にこのです:

file_exists(FALSE); //! 


補足として: realpathは決して "偽"値を返しません。これにより、 == FALSEが返されることはありませんが、 === FALSE(例えば、 NULL''、0、array())は返されません。どうして?実際のパスには、Windowsの* nixシステム(Mac、Unix、Linux)と C:\のルート— /への参照が常に含まれています。これらの2つの文字列は、 while、or forループ)。これはあなただけで行うことができますを意味します

if(!realpath(__DIR__."/../file.php")) // do something 

それとも、あなたが実際にする必要がある場合することができます、実パスを持っている:

if(!($path = realpath(__DIR__."/../file.php"))) 
    // file does not exist 
else 
    // $path is now the full path to the file 
+0

詳細説明...良い! :) – AgelessEssence

1

彼らはほぼ同じですが、ではない正確に!

ケースAは、パスが存在するかどうかをチェックします。パスを拡張した後にパスまたはフォルダを指す場合、realpathは偽でない値を返します。また、realpathnull値または空の文字列を渡すと、現在のフォルダが返されます。

ケースBは、返されたパスが(ディレクトリではなく)通常のファイルであるかどうかを確認することもできます。 realpathがフォルダへのパスを解決する場合、is_fileコールはfalseを返し、そこから処理できます。

したがってrealpathは、指定されたパスにファイルまたはフォルダ(またはシンボリックリンク)が存在するかどうかをチェックし、空の値を現在のディレクトリに展開します。 is_fileチェックを追加すると、フォルダではなくファイルで作業することができます。

ファイルを使用していることを確認するには、ケースBを使用してください(の代わりにis_file)。フォルダも大丈夫ならばケースAを使用してください。 :)

file_existsis_fileと対照的に)は、ディレクトリの場合もtrueを返します。

+0

いい加減な情報、ヌル値やemptry文字列が使用されている場合、私はrealpathの動作を知らなかった、ありがとう!! – AgelessEssence

関連する問題