51

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

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

还有其他方法吗?

4

6 回答 6

61

我相信file_exists确实适用于相对路径,尽管您也可以尝试这些方面的东西......

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

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

于 2010-02-12T14:57:14.850 回答
11

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

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

于 2012-10-29T08:25:34.907 回答
10

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

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

或者

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

或者

if (class_exists('class_name')) { /*code*/ }
于 2012-05-29T10:55:18.270 回答
6

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;
}
于 2010-02-12T15:02:27.020 回答
5

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

if (is_file('./path/to/your/file.php'))
{
    require_once('./path/to/your/file.php');
}
于 2010-02-12T15:17:00.553 回答
1

我认为正确的方法是:

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

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

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

于 2017-04-26T17:29:15.017 回答