出于性能原因,在检查文件或目录是否存在时,我们应该只使用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
两次完成工作。
答案 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
。