如何在调用之前检查include / require_once是否存在,我尝试将其放在错误块中,但PHP不喜欢它。
我认为file_exists()
可以付出一些努力,但这需要整个文件路径,并且不能轻易地将相对包含传递给它。
还有其他方法吗?
答案 0 :(得分:55)
我相信file_exists
确实适用于相对路径,不过你也可以尝试这些方法......
if(!@include("script.php")) throw new Exception("Failed to include 'script.php'");
...不用说,您可以将异常替换为您选择的任何错误处理方法。这里的想法是if
- 语句验证文件是否可以包含,并且include
通常输出的任何错误消息都会被@
加上前缀。
答案 1 :(得分:9)
您还可以检查包含文件中定义的任何变量,函数或类,并查看包含是否有效。
if (isset($variable)) { /*code*/ }
OR
if (function_exists('function_name')) { /*code*/ }
OR
if (class_exists('class_name')) { /*code*/ }
答案 2 :(得分:9)
查看stream_resolve_include_path函数, 它使用与include()相同的规则进行搜索。
http://php.net/manual/en/function.stream-resolve-include-path.php
答案 3 :(得分: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;
}
答案 4 :(得分:5)
file_exists()
适用于相对路径,它还会检查目录是否存在。请改用is_file()
:
if (is_file('./path/to/your/file.php'))
{
require_once('./path/to/your/file.php');
}
答案 5 :(得分:0)
我认为正确的方法是:
if(file_exists(stream_resolve_include_path($filepath))){
include $filepath;
}
这是因为the documentation表示stream_resolve_include_path
根据与fopen()/ include相同的规则解析了包含路径的文件名。“
有些人建议使用is_file
或is_readable
但不适用于一般用例,因为在一般用途中,如果文件被阻止或无法使用某些用户在file_exists返回TRUE之后的原因,这是你需要注意的事情,在最终用户的脸上有一个非常丑陋的错误消息,否则你可能会在以后出现意外和无法解释的行为,可能会丢失数据等等。< / p>