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

时间:2011-03-28 04:40:25

标签: php autoload redeclare

我有一个奇怪的问题。我有一个加载类的静态方法(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

2 个答案:

答案 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)){..}