“令人困惑”;无法重新声明类“;错误(PHP)

“令人困惑”;无法重新声明类“;错误(PHP),php,autoload,redeclare,Php,Autoload,Redeclare,我有一个奇怪的问题。我有一个加载类的静态方法(加载库)。当它加载一个特定的类时,它会给我一个“不能重新声明类”的致命错误,但是当在使用load_library方法加载该类之前测试该类是否存在时,它会说该类不存在。load\u库方法在其他地方工作时不会出现此类错误 如果我调用load_库,它会说在几行之后实际使用该类时找不到该类。更奇怪的是,如果我取而代之的是我注册的类自动加载函数,那么一切都能正常工作,即使这个自动加载函数甚至没有检查我试图加载的类所在的目录 这是一个涉及许多文件的复杂问题,因此

我有一个奇怪的问题。我有一个加载类的静态方法(加载库)。当它加载一个特定的类时,它会给我一个“不能重新声明类”的致命错误,但是当在使用load_library方法加载该类之前测试该类是否存在时,它会说该类不存在。
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之前,我检查了这个类是否存在。