我正在编写一个自动加载函数,并且在内部逻辑中它想测试某个文件是否存在于包含它之前的路径中。
这是逻辑:
如果包含路径中名为$className'.specialversion.php'
的文件存在 ,则包含该文件。否则,让其他自动加载器负责包含此类的文件。
目前我只是这样做:@include($calculatedPath);
我不确定这是否是一种包含和抑制错误的好方法。我希望在包含它之前检查文件是否存在(包含路径中的某个位置)。
我的问题是:
@include($calculatedPath);
真的有问题吗?修改
一个重要的口音:我不知道该文件应该在哪里。我只是想知道它是否存在于include路径的其中一个目录中。所以我不能只做file_exists()
或类似的东西。
答案 0 :(得分:33)
从PHP 5.3.2开始,可以选择使用stream_resolve_include_path()
函数,其目的是
根据与fopen()/ include()相同的规则,对包含路径解析[a]文件名。
如果文件存在于其中一个包含路径上,则将返回该路径(包括文件名)。否则(即文件不在任何包含路径上),它将返回FALSE
。
根据您的需求,您的自动加载器可能类似于:
function my_autoloader($classname) {
$found = stream_resolve_include_path($classname . '.specialversion.php');
if ($found !== FALSE) {
include $found;
}
}
答案 1 :(得分:3)
您应该避免使用错误supressor operator @
。
function autoload($class) {
// Build path (here is an example).
$path = DIR_CLASSES .
strtollower(str_replace('_', DIRECTORY_SEPARATOR, $class)) .
'.class.php';
if (file_exists($path)) {
include $path;
}
}
spl_autoload_register('autoload');
$front = new Controller_Front;
// Loads "application/classes/controller/front.class.php" for example.
一个重要的口音:我不知道文件应该在哪里,我只是想知道它是否存在于include路径中的一个目录中。所以我不能只做file_exists或类似的东西
如果你的班级可以在多个目录中,你可以......
如果您决定遍历查找该类的所有文件夹,并且它成为瓶颈(基准测试),您可以将类名称缓存到文件位置映射中。
答案 2 :(得分:3)
我会使用file_exists
而不是警告抑制包含。
然后你必须遍历include_path
:
$paths = explode(';', get_include_path());
foreach($paths as $p){
if(file_exists($p . '/' . $calculatedPath)){
include $p . '/' . $calculatedPath;
break;
}
}
答案 3 :(得分:0)
我写了一个可以很好地测试它的函数
function fileExists($file) {
if(function_exists('stream_resolve_include_path'))
return stream_resolve_include_path($file);
else {
$include_path = explode(PATH_SEPARATOR, get_include_path());
foreach($include_path as $path)
if(file_exists($path.DS.$file))
return true;
return false;
}
}
答案 4 :(得分:0)
作为一个简单的解决方案,您应该通过将第二个参数设置为TRUE来在SPL函数file_get_contents()中进行测试。
- 罗尔夫