“令人困惑”;无法重新声明类“;错误(PHP)
我有一个奇怪的问题。我有一个加载类的静态方法(加载库)。当它加载一个特定的类时,它会给我一个“不能重新声明类”的致命错误,但是当在使用load_library方法加载该类之前测试该类是否存在时,它会说该类不存在。“令人困惑”;无法重新声明类“;错误(PHP),php,autoload,redeclare,Php,Autoload,Redeclare,我有一个奇怪的问题。我有一个加载类的静态方法(加载库)。当它加载一个特定的类时,它会给我一个“不能重新声明类”的致命错误,但是当在使用load_library方法加载该类之前测试该类是否存在时,它会说该类不存在。load\u库方法在其他地方工作时不会出现此类错误 如果我调用load_库,它会说在几行之后实际使用该类时找不到该类。更奇怪的是,如果我取而代之的是我注册的类自动加载函数,那么一切都能正常工作,即使这个自动加载函数甚至没有检查我试图加载的类所在的目录 这是一个涉及许多文件的复杂问题,因此
load\u库
方法在其他地方工作时不会出现此类错误
如果我调用load_库,它会说在几行之后实际使用该类时找不到该类。更奇怪的是,如果我取而代之的是我注册的类自动加载
函数,那么一切都能正常工作,即使这个自动加载
函数甚至没有检查我试图加载的类所在的目录
这是一个涉及许多文件的复杂问题,因此很难发布代码,但这个问题对任何人来说都很熟悉吗
我的加载库方法:
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);
}
}
}
lev::load_library('lev_unit_tester/lev_base_test');
我对load_库方法的调用:
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);
}
}
}
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');
}
}
我试图加载的类(这是发生错误的地方):
实际错误消息:
致命错误:无法在第5行的/some/path/application/libraries/lev_unit_tester/lev_base_test.php中重新声明类lev_base_test
您正在通过以下方式调用
load\u库
方法:
lev::load_library('lev_unit_tester/lev_base_test');
这意味着,如果有一个名为lev\u unit\u tester/lev\u base\u test
的类,那么您正在使用class\u exists()
进行测试,但情况可能并非如此:这不是一个类的有效名称
因此class_exists()
返回false
;因此,每次调用load\u library
方法时,您都会尝试包含包含类的文件
当您使用自动加载时没有问题,因为只有当您尝试使用尚未定义的类时,PHP才会调用您的自动加载程序:一旦包含了与类对应的文件,将不会再次为该类调用自动加载程序。尝试此操作
// Check to see whether the include declared the class
if (!class_exists($class, false)){..}
奇怪的是:
class\u exists()
似乎接收到与load\u library
方法相同的$name
参数,并且得到的致命错误消息显示$name
是“lev\u unit\u tester/lev\u base\u test”。class\u exists调用使用文本字符串作为参数,其中,load_库调用使用路径/文件名作为参数…my class exists调用如下所示:if(!class_exists('lev_base_test'))echo'blahblahblah';我不确定你读这个问题是否考虑得很周到。我知道自动加载是如何工作的。自动加载甚至可能无法加载该类文件,因为它根本不检查该目录中的类文件。我提到它的唯一原因是,它的删除似乎阻止了错误的发生,这根本没有意义。这有点早,所以我可能是错的,但我没有看到硬编码的class\u存在()
调用您发布的代码;相反,我看到class\u exists($name)
,其中$name
被传递到lev::load\u library
作为'lev\u unit\u tester/lev\u base\u test'
当我执行包含操作时,我得到错误。在我进行include之前,我检查了这个类是否存在。