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

你怎么检查一个include / require_once是否存在,然后再调用它,我试图把它放在一个错误块中,但PHP不喜欢这样做。

我认为file_exists()会花费一些努力,但是这将需要整个文件path,并且相对包含不能被轻易地传入。

还有其他的方法吗?

我相信file_exists确实与相对path工作,但你也可以尝试沿着这些线路…

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

不用说,你可以用你select的任何error handling方法替代例外。 这里的想法是if语句validation文件是否可以被包含,并且任何通常由include输出的错误消息都通过用@作为前缀来压制。

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

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

您还可以检查包含文件中定义的任何variables,函数或类,并查看包含是否工作。

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

要么

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

要么

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

file_exists可以检查相对于当前工作目录的文件是否存在,因为它可以很好地处理相对path。 但是,如果include文件位于PATH的其他位置,则必须检查多个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()与相对path一起工作,它也会检查目录是否存在。 使用is_file()来代替:

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

我认为正确的做法是:

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

这是因为文档说stream_resolve_include_path根据与fopen()/ include相同的规则来parsing“包含path的文件名”。

有些人build议使用is_fileis_readable但这不是一般用例,因为在一般使用情况下 ,如果file_exists返回TRUE后文件被阻塞或不可用,这是一个你需要注意的非常难看的东西错误信息直接在最终用户的脸上,否则你可能会意外地发生莫名其妙的行为,以后可能会丢失数据和类似的东西。