php,realpath与realpath + file_exists用法

时间:2011-12-04 07:03:23

标签: php performance

出于性能原因,在检查文件或目录是否存在时,我们应该只使用realpath()而不是realpath() + file_exists()

CASE A ::

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

CASE B ::

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

我认为CASE A完成工作,CASE B两次完成工作。

3 个答案:

答案 0 :(得分:7)

案例B不仅冗余(如果无法解析路径,或者文件根据docs不存在,则realpath返回false),如果文件不存在,那有点傻。 / p>

由于此语句将返回FALSE

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

此:

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

真的是这样的:

file_exists(FALSE); //!

<小时/> 作为旁注:realpath永远不会返回“FALSY”值。我的意思是它永远不会返回== FALSE但不=== FALSE的东西(例如NULL'',0,array())。为什么?那么,实际路径将始终包含对* - nix系统(Mac,Unix,Linux)中的根/和Windows中的C:\的引用,并且当用作这两个字符串时,这两个字符串将评估为true一个布尔值(比如在if,while或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

答案 1 :(得分:2)

这是正确的。如果文件不存在,realpath()将返回false。案例B是多余的。

http://us3.php.net/realpath#refsect1-function.realpath-returnvalues

答案 2 :(得分:1)

它们几乎相同,但并不完全相同!

案例A将检查路径是否存在,如果展开后的路径指向文件或文件夹realpath将返回非假值。此外,如果您传递realpath一个null - 值或空字符串,它将返回当前文件夹。

案例B还可以检查返回的路径是否是常规文件(而不是目录!)。如果realpath解析了文件夹的路径,则is_file调用将返回false,您可以从那里处理它。

因此realpath将检查给定路径上是否存在文件或文件夹(或符号链接)并将空值扩展到当前目录。额外的is_file检查可以确保您使用的是文件而不是文件夹。

如果您想确定自己正在使用文件,请使用案例B(使用is_file代替file_exists),如果文件夹也可以,请使用案例A. :)

file_exists(与is_file相反)也会为目录返回true