【问题标题】:Check if an include (or require) exists检查包含(或要求)是否存在
【发布时间】:2011-01-16 04:35:51
【问题描述】:

在调用之前如何检查 include / require_once 是否存在,我尝试将其放入错误块中,但 PHP 不喜欢这样。

我认为file_exists() 会付出一些努力,但这需要整个文件路径,并且无法轻松地将相对包含传递给它。

还有其他方法吗?

【问题讨论】:

  • 你能给我们看一些代码吗?你能解释一下你想做什么吗?
  • @GZipp:致所有建议使用file_exists()的人: 检查文件或目录是否存在。 is_file() 更适合这种情况。
  • @Alix Axel:对于所有正在向我讲话的人:我只是在暗示 Smickie 的假设(相对路径不能轻易转换为完整路径)是错误的。其他人指出不需要完整路径。因此我的评论而不是回答。
  • @Alix: is_file() isfile_exists() 更好,但使用is_readable() 不是更好吗?
  • @AgentConundrum: is_readable(): "如果文件名指定的文件或目录存在并且可读,则返回 TRUE,否则返回 FALSE"。

标签: php include exists require


【解决方案1】:

我相信file_exists 确实适用于相对路径,但您也可以尝试这些方法...

if(!@include("script.php")) throw new Exception("Failed to include 'script.php'");

...不用说,您可以用异常替换您选择的任何错误处理方法。这里的想法是if-statement 验证是否可以包含文件,并且通常由include 输出的任何错误消息都通过在其前面加上@ 来抑制。

【讨论】:

  • include 的参数值不需要括号。 include 不是函数,而是像 echo 这样的语言结构。
  • @Gumbo 我认为将括号用于语言结构是一种很好的做法,就像我使用 echo()print() 一样。
  • 我不确定这是不是一个好的解决方案:您不会看到致命错误。
  • @Michal Malunga:我不确定你是否理解这个问题。
  • 最好使用include_oncerequire_once,这将有助于使用OOP概念并避免再次重新声明类。
【解决方案2】:

查看 stream_resolve_include_path 函数, 它使用与 include() 相同的规则进行搜索。

http://php.net/manual/en/function.stream-resolve-include-path.php

【讨论】:

  • 一些用户在这里贡献了注释:stream_resolve_include_path() 似乎缓存了它的输出。重命名文件后,我必须为 stream_resolve_include_path() 重新启动 Apache 以不返回不存在的文件名。这是在 Windows 上。它的行为确实像 include 并且只会根据包含路径解析文件名,如果路径是相对的。无论如何,解析已经是绝对路径名没有多大意义。
【解决方案3】:

您还可以检查包含文件中定义的任何变量、函数或类,并查看包含是否有效。

if (isset($variable)) { /*code*/ }

if (function_exists('function_name')) { /*code*/ }

if (class_exists('class_name')) { /*code*/ }

【讨论】:

  • 这里的问题是,如果包含首先不起作用 - 它会抛出错误/警告..
【解决方案4】:

file_exists 将在所需文件相对于当前工作目录时检查它是否存在,因为它适用于相对路径。但是,如果包含文件位于 PATH 的其他位置,则必须检查多个路径。

function include_exists ($fileName){
    if (realpath($fileName) == $fileName) {
        return is_file($fileName);
    }
    if ( is_file($fileName) ){
        return true;
    }

    $paths = explode(PS, get_include_path());
    foreach ($paths as $path) {
        $rp = substr($path, -1) == DS ? $path.$fileName : $path.DS.$fileName;
        if ( is_file($rp) ) {
            return true;
        }
    }
    return false;
}

【讨论】:

  • file_exists 无法在包含路径中搜索。您必须手动解析它们。
  • PS == PATH_SEPARATOR && DS == DIRECTORY_SEPARATOR 对于那些想知道的人,+1,希望你能修复它,这很好用,而且没有异常和错误处理的开销
【解决方案5】:

file_exists() 使用相对路径,它还会检查目录是否存在。请改用is_file()

if (is_file('./path/to/your/file.php'))
{
    require_once('./path/to/your/file.php');
}

【讨论】:

  • 虽然它适用于相对路径,但它不适用于包含路径——需要注意的一点 ;)
【解决方案6】:

我认为正确的做法是:

if(file_exists(stream_resolve_include_path($filepath))){
  include $filepath;    
}

这是因为the documentation 表示stream_resolve_include_path 会根据与 fopen()/include 相同的规则解析“包含路径的文件名”。

有人建议使用is_fileis_readable,但这不适用于一般用例,因为在一般使用中,如果文件在 file_exists 返回后由于某种原因被阻止或不可用是的,您需要在最终用户的脸上使用非常难看的错误消息来注意这一点,否则您以后可能会遇到意外和莫名其妙的行为,可能会丢失数据等类似情况。

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 2012-10-11
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2015-08-03
    • 1970-01-01
    相关资源
    最近更新 更多