сбивающая с толку ошибка «невозможно переопределить класс» (PHP) - PullRequest
1 голос
/ 28 марта 2011

У меня странная проблема. У меня есть статический метод, который загружает классы (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 {

}

Фактическое сообщение об ошибке:

Неустранимая ошибка: невозможно переопределить класс lev_base_test в /some/path/application/libraries/lev_unit_tester/lev_base_test.php в строке 5

Ответы [ 2 ]

0 голосов
/ 28 марта 2011

попробуйте

// Check to see whether the include declared the class
    if (!class_exists($class, false)){..}
0 голосов
/ 28 марта 2011

Вы вызываете ваш 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 будет вызывать только ваш автозагрузчик.когда вы пытаетесь использовать класс, который не был определен: после включения файла, соответствующего этому классу, автозагрузка больше не будет вызываться для этого класса.

...