Ленивые классы включают PHP

Я использую автозагрузчик для включения классов. Что я сейчас делаю, так это использую "glob" для чтения различных директорий и вставки их в массив. Есть ли лучшее решение для этого?

$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'));

РЕДАКТИРОВАТЬ:

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


person Simon    schedule 20.11.2010    source источник


Ответы (3)


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

/path/to/includes/classes/system/

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

person Gordon    schedule 20.11.2010
comment
Но и здесь мне нужны файлы. Таким образом, приведенный выше код не изменился. Я уже использую spl_autoload_register (как показывают теги) - person Simon; 20.11.2010
comment
Что ты имеешь в виду, мне нужны файлы? Если вам нужна карта, потому что вы думаете, что поиск по include_path медленный, рассмотрите возможность создания карты с использованием любой стратегии и кэширования ее где-нибудь (простой файл, APC, memcache). - person timdev; 20.11.2010
comment
Звучит лучше, я попробую! - person Simon; 21.11.2010

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

person meagar    schedule 20.11.2010

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);
person Langel    schedule 20.11.2010
comment
Я использую одноэлементный класс, в котором я храню файлы, поэтому мне нужно выполнить только проверку isset вместо проверки is_file. - person Simon; 21.11.2010