PHP自动加载程序:忽略不存在的include
我的自动加载器有问题:PHP自动加载程序:忽略不存在的include,php,error-handling,autoload,Php,Error Handling,Autoload,我的自动加载器有问题: public function loadClass($className) { $file = str_replace(array('_', '\\'), '/', $className) . '.php'; include_once $file; } 正如你所看到的,这很简单。我只是推导出类的文件名,并尝试将其包含在内。不过我有个问题;我在尝试加载一个不存在的类时遇到异常(因为我有一个抛出异常的错误处理程序)。这很不方便,因为在不存在的类上使用类_ex
public function loadClass($className) {
$file = str_replace(array('_', '\\'), '/', $className) . '.php';
include_once $file;
}
正如你所看到的,这很简单。我只是推导出类的文件名,并尝试将其包含在内。不过我有个问题;我在尝试加载一个不存在的类时遇到异常(因为我有一个抛出异常的错误处理程序)。这很不方便,因为在不存在的类上使用类_exists()时也会触发它。您不希望出现异常,只返回一个“false”
我早些时候通过在include前面加一个@(消除所有错误)修复了这个问题。不过,这种方法的一大缺点是,该include中的任何解析器/编译器错误(致命的)都不会出现(甚至不会出现在日志中),从而导致难以发现的bug
同时解决这两个问题的最佳方法是什么?最简单的方法是在自动加载器(伪代码)中包含如下内容:
但我担心那里的表现。会很痛吗
(解决)这样做:
public function loadClass($className) {
$file = str_replace(array('_', '\\'), '/', $className) . '.php';
$paths = explode(PATH_SEPARATOR, get_include_path());
foreach ($paths as $path) {
if (is_readable($path . '/' . $file)) {
include_once $file;
return;
}
}
}
public function loadClass($className) {
$file = str_replace(array('_', '\\'), '/', $className) . '.php';
$paths = explode(PATH_SEPARATOR, get_include_path());
foreach ($paths as $path) {
if (is_readable($path . '/' . $file)) {
include_once $file;
return;
}
}
}
每个类只调用一次,所以性能应该不是问题
public function loadClass($className) {
$file = str_replace(array('_', '\\'), '/', $className) . '.php';
if(is_readable($file))
include_once $file;
}
可读性不会产生巨大的性能差异。类的exists()还有第二个参数autoload
,当设置为FALSE时,它不会触发不存在的类的自动加载程序。(已解决)如下所示:
public function loadClass($className) {
$file = str_replace(array('_', '\\'), '/', $className) . '.php';
$paths = explode(PATH_SEPARATOR, get_include_path());
foreach ($paths as $path) {
if (is_readable($path . '/' . $file)) {
include_once $file;
return;
}
}
}
public function loadClass($className) {
$file = str_replace(array('_', '\\'), '/', $className) . '.php';
$paths = explode(PATH_SEPARATOR, get_include_path());
foreach ($paths as $path) {
if (is_readable($path . '/' . $file)) {
include_once $file;
return;
}
}
}
除此之外,我必须对每个include路径执行此操作(我想平均有4个)。我知道,如果我将其设置为false,则整个函数对我来说都是无用的。;)