file_exists() 或 is_readable()

29

当您想要包含一个PHP文件时,应该使用哪一个?

if(file_exists($file) require "$file";

或者

if(is_readable($file) require "$file";

?

4个回答

39

是否应该在想要包含PHP文件时使用file_exists()is_readable()

这取决于您是只想知道文件或目录是否存在,还是无论哪个都可以,以及是否需要检查可读性。

有时您只关心文件和/或目录是否存在,而不需要读取,有时您也需要读取。

选项

file_exists()

检查文件目录是否存在。

如果您明确只想知道文件是否存在,则此函数会返回false positive,因为如果它是一个目录,则将返回true。

is_readable()

告诉您文件目录是否存在且可读。

如果您明确只想知道文件是否可读,则可能会返回false positive,因为它也可能返回true,即使它是一个目录。


您没有提到但可能需要的其他选项:

is_file()

告诉您它是否存在并且是一个普通的文件(不是目录)。

is_dir()

告诉您它是否存在并且是一个目录(不是文件)。

解决方案和答案

如果您想检查是否存在并且:

  1. 仅为文件:请使用is_file()
  2. 只是目录: 使用is_dir()
  3. 是文件或目录: 使用file_exists()

如果您想检查是否存在且可读:

  1. 仅为文件: 使用is_file()is_readable()
  2. 仅为目录:使用is_dir()is_readable()
  3. 是文件或目录:使用is_readable()

您不需要同时使用file_exists()is_readable(),因为is_readable()也会检查file_exists()
is_readable()is_file()is_dir()配对仅是为了检查是否可以读取特定的文件或目录。


依赖于require

与大多数PHP相关的问题一样,“最佳方法/函数等”取决于情况。

仅依赖于require来管理系统是否挂起并不是非常有用。想象一下所需的文件不可用,因此当require失败时,PHP会停止,但该文件仅是文章图片或用户头像-仅仅因为缺少一张文章图片就不想提供站点导航、标志、链接、各种页面文本和内容吗?

重要:
如果该文件是数据库连接类,允许提供整个页面内容,则缺少该文件可能需要系统停止。
当然,您应该有某种退出策略,例如提供404页面或错误消息-“抱歉,出现故障,我们会查看它”等。

非重要:
文件不存在有时是有效的,或者至少不会对其余应用程序造成伤害。

例如,如果图像文件不存在,您可以提供一条消息或默认图像,例如如果用户的头像未找到,则只会有一个默认头像。


2
到目前为止,这是最好的答案!+1 - ˈvɔlə
使用 is_file() 检查缺失的文章图片,以避免不必要的警告和错误。 - user2757283
在一个遗留的代码库中,我偶然发现了@require "CustomConst.php";。意图是这个文件是可选的,所以,@require 如果文件不存在就会静默忽略。现在,在php 7.4中这不再起作用,所以我想用类似if (is_readable('...')) { require_once '...'; }来替换它。问题是:is_readable()会扫描所有的包含目录(就像require_once一样)吗?如果不会,那它在功能上就不是完全相同的替代方案了 :( - undefined
如果“文件是可选的”,也许使用include更合适?不确定这是否能解决问题。 - undefined
@James嗯,这是一个遗留项目中的一个问题。我们在其中有@require_once "CustomConst.php",我猜在早期版本中它是有效的,但在php7.4中会生成一个错误。我的第一反应是用if (file_exists(...)) { require_once "CustomConst.php"; }来替换它,但接下来的问题是:这个文件应该放在哪里。显然,@require_once会在所有的"include_dirs"中搜索它,但file_exists()不会。最后,我找到了这个东西:if (stream_resolve_include_path('CustomConst.php') !== false) ...。这应该按预期工作。 - undefined

10
如果您要`require`一个文件,那么没有错误检查的必要。使用`require`而不是`include`的目的是当文件不存在时停止脚本的执行。
如果您不关心文件是否存在,只需使用`include`即可。

2
但是如果您不确定文件是否存在呢? - Co za asy...
3
require 用于确保在继续之前文件已存在。如果该文件被 要求,并且文件不存在,则会抛出错误。如果文件对您的页面不是至关重要的话,则使用 include - Nahydrin

9

2
是的,但在下面更进一步地说:“如果由文件名指定的文件或目录存在且可读,则返回TRUE,否则返回FALSE。” - nevvermind
1
这是正确的答案。建议使用“&& is_file($filename)”来增加对文件夹的透明度,因为它们也会返回true。 - tfont

8
if (is_file($file) && is_readable($file))

因为is_readable($file)也可以用于目录,所以需要注意。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接