2010-11-20 7 views
0

Я использую автозагрузчик для включения классов. То, что я делаю прямо сейчас, использует «glob», чтобы читать разные dir и нажимать их в массиве. Есть ли лучшее решение для этого?Lazy Classes Включает PHP

$path = './'; 

$files = array_merge(
glob($path.'includes/classes/system/*.class.php'), 
glob($path.'includes/classes/system/baseclasses/*.class.php'), 
glob($path.'includes/classes/system/systementities/*.class.php')); 

EDIT:

Я использую это внутри класса автозагрузку. Проблема в том, что я должен искать файлы с glob. Есть ли более быстрый способ сделать это?

ответ

1

Автозагрузка будет инициироваться всякий раз, когда вы пытаетесь использовать класс, который не знает PHP. Если вы используете include/require, PHP будет проходить через все каталоги, указанные вами для вашего include_path в PHP.ini, поэтому не должно быть причин для использования glob. В вашем случае, это должно быть достаточно, чтобы установить include_path к

/path/to/includes/classes/system/ 

В быстрого способа включить файлы будет использовать class2file map. Однако для этого требуется создать такую ​​карту и обновить ее при изменении вашего приложения.

+0

Но здесь мне тоже нужны файлы. Таким образом, код выше не изменяется. Я уже использую spl_autoload_register (как показывают теги) – Simon

+0

Что значит «Мне нужны файлы»? Если вам нужна карта, потому что вы считаете, что поиск по include_path медленный, подумайте о создании карты с использованием любой стратегии и ее кешировании (простой файл, APC, memcache). – timdev

+0

Звучит лучше, я попробую! – Simon

1

PHP уже решил эту проблему для вас. Используйте PHP built-in autoloader. Никогда не откатывайте свои собственные, когда язык/рамки предоставляет его вам.

0
function __autoload($class) { 
    $classfile = $class.'.class.php'; 
    $path = './includes/classes/system/'; 
    if (is_file($path.$classfile)) require_once($path.$classfile); 
    if (is_file($path.'baseclasses/'.$classfile)) require_once($path.'baseclasses/'.$classfile); 
    if (is_file($path.'systementities/'.$classfile)) require_once($path.'systementities/'.$classfile); 
} 

... который по-прежнему не самый лучший способ, но он помогает вам использовать glob(). Если вы обычно загружаете все свои системы, в сценарии загрузки/конфигурации должен быть записан жесткий список require(). Существует множество опций по организации и выборке файлов классов. Чтобы сократить время поиска скриптов, вы можете представить свой файл в качестве интерфейса. Для простоты вы можете поместить все необязательные классы в одну и ту же папку, уменьшая количество вызовов is_file() до одного.

В моей системе у меня есть классы объектов, сгруппированные в папки со своими контрольными скриптами и представлениями. Моя функция __autoload() имеет более простую работу -

$classfile = $path.$class.'/'.$class.'_class.php'; 
if (is_file($classfile)) require_once($classfile); 
+0

Я использую класс singleton, где храню файлы, поэтому мне нужно только выполнить проверку isset вместо проверки is_file – Simon

 Смежные вопросы

  • Нет связанных вопросов^_^