由于性能原因,在检查文件或目录是否存在时,我们应该只使用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
做了两次。
不仅情况B是多余的(因为如果路径无法解析或文件不存在,则realpath返回false),如果文件不存在,那就有点傻了。
由于该语句将返回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:'
,并且这两个字符串在用作布尔值(例如在if, while或for循环中)时将计算为true。这意味着你可以这样做:
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
正确。如果文件不存在,Realpath()将返回false。案例B是多余的。
http://us3.php.net/realpath refsect1-function.realpath-returnvalues
它们几乎相同,但又不完全相同!
Case A将检查路径是否存在,如果路径展开后指向文件或文件夹, realpath
将返回非假值。此外,如果您向realpath
传递null
-值或空字符串,它将返回当前文件夹。
Case B还可以检查返回的路径是否为常规文件(而不是目录!)。如果realpath解析路径到一个文件夹,一个is_file
调用将返回false
,你可以从那里处理它。
因此realpath
将检查给定路径下是否有文件或文件夹(或符号链接),并将空值扩展到当前目录。额外的is_file
检查可以确保您正在处理的是文件而不是文件夹。
用例B(用is_file
代替file_exists
),如果你想确保你正在处理一个文件,用例a,如果文件夹也可以。:)
file_exists
(与is_file
相反)对于目录也返回true
。