PHP автозагрузчик: игнорирование несуществующего включения - PullRequest
0 голосов
/ 24 августа 2009

У меня проблема с автозагрузчиком:

public function loadClass($className) {
    $file = str_replace(array('_', '\\'), '/', $className) . '.php';
    include_once $file;
}

Как видите, все довольно просто. Я просто выводю имя файла класса и пытаюсь включить его. У меня есть проблема, хотя; Я получаю исключение при попытке загрузить несуществующий класс (потому что у меня есть обработчик ошибок, который выбрасывает исключения). Это неудобно, потому что оно также срабатывает, когда вы используете class_exists () для несуществующего класса. Вам не нужно исключение, просто возвращается false.

Я исправил это раньше, поставив @ перед включением (подавляя все ошибки). Тем не менее, большой недостаток заключается в том, что любые ошибки синтаксического анализатора / компилятора (которые являются фатальными) в этом включении не будут отображаться (даже в журналах), что приведет к трудно обнаруживаемой ошибке.

Как лучше всего решить обе проблемы одновременно? Проще всего было бы включить что-то подобное в автозагрузчик (псевдокод):

foreach (path in the include_path) {
    if (is_readable(the path + the class name)) readable = true;
}
if (!readable) return;

Но я беспокоюсь о производительности там. Будет ли это больно?


(решено) Сделано так:

public function loadClass($className) {

    $file = str_replace(array('_', '\\'), '/', $className) . '.php';    
    $paths = explode(PATH_SEPARATOR, get_include_path());
    foreach ($paths as $path) {
        if (is_readable($path . '/' . $file)) {
                        include_once $file;
                        return;
                    }
    }

}

Ответы [ 4 ]

0 голосов
/ 25 августа 2009

(решено) Сделано так:

public function loadClass($className) {

    $file = str_replace(array('_', '\\'), '/', $className) . '.php';    
    $paths = explode(PATH_SEPARATOR, get_include_path());
    foreach ($paths as $path) {
        if (is_readable($path . '/' . $file)) {
                        include_once $file;
                        return;
                    }
    }

}
0 голосов
/ 24 августа 2009
 public function loadClass($className) {
     $file = str_replace(array('_', '\\'), '/', $className) . '.php';
     if(is_readable($file))
       include_once $file;
 }

is_readable не будет иметь большого значения для производительности.

0 голосов
/ 24 августа 2009

class_exists () имеет второй параметр autoload, который при значении FALSE не запускает автозагрузчик для несуществующего класса.

0 голосов
/ 24 августа 2009

Он вызывается только один раз для каждого класса, поэтому производительность не должна быть проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...