2

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

4

2 回答 2

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 只会在您尝试使用尚未定义的类时调用您的自动加载器:一旦包含对应于某个类的文件,则不会调用自动加载器又是那堂课。

于 2011-03-28T04:42:59.303 回答
0

尝试这个

// Check to see whether the include declared the class
    if (!class_exists($class, false)){..}
于 2011-03-28T04:44:08.533 回答