2009-08-24 2 views
0

У меня есть проблема с моим заряжания:PHP автозагрузчика: игнорирование несуществующих включают

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

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

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

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

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; 
        } 
    } 

} 

ответ

0

Это только дозвонились один раз в классе, так что производительность не должно быть проблемой.

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

is_readable не будет иметь большой разницы в производительности.

+0

Кроме того, что я должен сделать это для каждого включают путь (который есть около 4, в среднем, я предположил бы). –

0

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

+0

Я знаю, и если я устанавливаю это на ложь, вся функция для меня совершенно бесполезна. ;) –

0

(Раскрыты) Сделано это следующим образом:

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; 
        } 
    } 

}