我的自动加载器出现问题:
public function loadClass($className) {
$file = str_replace(array('_', '\\'), '/', $className) . '.php';
include_once $file;
}
如您所见,这很简单。我只是推断出类的文件名并尝试包含它。我有一个问题;我在尝试加载一个不存在的类时遇到异常(因为我有一个抛出异常的错误处理程序)。这很不方便,因为在不存在的类上使用class_exists()时也会触发它。你不希望有例外,只返回“假”。
我之前通过在include之前放置@来解决这个问题(压制所有错误)。但是,这个问题的一大缺点是,这个包含的任何解析器/编译器错误(致命)都不会显示(甚至不会出现在日志中),导致很难找到错误。
一次解决这两个问题的最佳方法是什么?最简单的方法是在自动加载器(伪代码)中包含类似的内容:
foreach (path in the include_path) {
if (is_readable(the path + the class name)) readable = true;
}
if (!readable) 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;
}
}
}
答案 0 :(得分:0)
每个类只会调用一次,因此性能不应该成为问题。
答案 1 :(得分:0)
public function loadClass($className) {
$file = str_replace(array('_', '\\'), '/', $className) . '.php';
if(is_readable($file))
include_once $file;
}
is_readable不会产生巨大的性能差异。
答案 2 :(得分:0)
class_exists()有第二个参数autoload
,当设置为FALSE时,不会触发自动加载器以获取不存在的类。
答案 3 :(得分:0)
(已解决)像这样:
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;
}
}
}