我有一个奇怪的问题。我有一个加载类的静态方法(load_library)。当它加载一个特定的类时,它给了我一个“不能重新声明类”的致命错误,但是当在使用load_library方法加载它之前测试该类是否存在时,它表示该类不存在。 load_library
方法可在其他地方使用而不会出现此类错误。
如果我调用了load_library,它表示当类实际使用几行之后它找不到类。更奇怪的是,如果我取出已注册的类autoload
函数,一切都运行正常,即使这个autoload
函数甚至没有检查我正在尝试加载的类所在的目录。
这是一个涉及很多文件的复杂问题,因此很难发布代码,但这个问题对于那里的任何人来说都很熟悉吗?
我的load_library方法:
public static function load_library($name) {
if (!class_exists($name)) {
if (file_exists('application/libraries/' . $name . '.php')) {
include('application/libraries/' . $name . '.php');
} else {
trigger_error('Request made for non-existant library ('.$name.').', E_USER_ERROR);
}
}
}
我对load_library方法的调用:
lev::load_library('lev_unit_tester/lev_base_test');
我注册的自动加载方法:
public static function autoloader($name) {
if (class_exists($name)) return;
if (file_exists('application/libraries/' . $name . '.php')) {
include('application/libraries/' . $name . '.php');
}
}
我正在尝试加载的类(这是发生错误的地方):
abstract class lev_base_test {
}
实际的错误讯息:
致命错误:无法在第5行的/some/path/application/libraries/lev_unit_tester/lev_base_test.php中重新声明类lev_base_test
答案 0 :(得分:0)
您以这种方式呼叫load_library
方法:
lev::load_library('lev_unit_tester/lev_base_test');
这意味着您正在使用class_exists()
进行测试,如果有一个名为lev_unit_tester/lev_base_test
的类 - 可能不是这样的情况:这不是类的有效名称。
所以class_exists()
返回false
;因此,每次调用load_library
方法时,都会尝试包含包含类的文件。
使用自动加载时没有问题,因为PHP只会在您尝试使用尚未定义的类时调用自动加载器:一旦包含与类对应的文件,将不会调用自动加载再次上课。
答案 1 :(得分:0)
试试这个
// Check to see whether the include declared the class
if (!class_exists($class, false)){..}