检查是否存在包含(或要求)

Check if an include (or require) exists

提问人:CafeHey 提问时间:2/12/2010 最后编辑:Alix AxelCafeHey 更新时间:4/27/2017 访问量:93422

问:

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

我认为需要付出一些努力,但是这需要整个文件路径,并且无法轻易将相对包含传递到其中。file_exists()

还有其他方法吗?

php include 存在 require

评论

1赞 JPro 2/12/2010
你能给我们看一些代码吗?你能解释一下你想做什么吗?
3赞 Alix Axel 2/12/2010
@GZipp:对于所有建议使用 file_exists()检查文件或目录是否存在。 在这种情况下会更合适。is_file()
1赞 GZipp 2/12/2010
@Alix 阿克塞尔:对所有向我讲话的人:我只是想说,Smickie的假设(相对路径不能轻易转换为完整路径)是错误的。其他人则指出,完整的路径是没有必要的;因此,我的评论而不是回答。
0赞 AgentConundrum 11/24/2010
@Alix:更好,但使用起来不是更好吗?is_file()file_exists()is_readable()
1赞 Alix Axel 11/24/2010
@AgentConundrum: : “如果文件名指定的文件或目录存在且可读,则返回 TRUE,否则返回 FALSE”。is_readable()

答:

61赞 Johannes Gorset 2/12/2010 #1

我相信确实适用于相对路径,尽管您也可以尝试沿着这些思路进行一些操作......file_exists

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

...毋庸置疑,您可以将异常替换为您选择的任何错误处理方法。这里的想法是 -statement 验证是否可以包含该文件,并且通常由 输出的任何错误消息都会通过在它前面加上 .ifinclude@

评论

2赞 Gumbo 2/12/2010
不需要将 的参数值括起来。 不是一个函数,而是一种语言结构,如.includeincludeecho
7赞 Johannes Gorset 2/12/2010
@Gumbo我认为将参数用于语言结构是一种很好的做法,就像我使用 and 一样。echo()print()
2赞 Michał Maluga 8/23/2011
我不确定这是否是一个好的解决方案:您不会看到致命错误。
1赞 Johannes Gorset 8/24/2011
@Michal Malunga:我不确定你是否理解这个问题。
3赞 Rafee 8/23/2012
最好使用 或 ,这在使用 Concept 时会很有帮助,并避免再次重新声明类。include_oncerequire_onceOOP
6赞 Yacoby 2/12/2010 #2

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;
}

评论

1赞 Petr Peller 2/12/2010
file_exists无法在包含路径中搜索。您必须手动解析它们。
1赞 mschr 7/16/2012
PS == PATH_SEPARATOR & DS == DIRECTORY_SEPARATOR对于那些想知道的人,+1,希望你能修复它,这很好用,没有异常和错误处理的开销
7赞 Alix Axel 2/12/2010 #3

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

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

评论

0赞 Billy ONeal 2/12/2010
虽然它适用于相对路径,但它不适用于包含路径 - 需要注意;)
9赞 Khawar 5/29/2012 #4

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

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

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

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

评论

0赞 Obmerk Kronen 2/25/2014
这里的问题是,如果包含首先不起作用 - 它会抛出错误/警告.
12赞 Stephane JAIS 10/29/2012 #5

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

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

评论

0赞 RationalRabbit 5/7/2019
这里有几个用户贡献的注释: stream_resolve_include_path() 似乎缓存了它的输出。重命名文件后,我必须重新启动 Apache,以便 stream_resolve_include_path() 不返回不存在的文件名。这是在 Windows 上。如果路径是相对的,它的行为确实像并且只会根据 include-path 解析文件名。无论如何,解析已经绝对的路径名没有多大意义。include
2赞 jacmkno 4/27/2017 #6

我认为正确的方法是:

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

这是因为文档说,根据与 fopen()/include 相同的规则,将文件名解析为包含路径。stream_resolve_include_path

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