Ленивые классы включают PHP
-
26-09-2019 - |
Вопрос
Я использую автозагрузчик для включения классов.Сейчас я использую «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.Есть ли более быстрый способ сделать это?
Решение
Автозагрузка будет запускаться всякий раз, когда вы пытаетесь использовать класс, который не известен PHP.Если вы используете include
/require
, PHP пройдет через все каталоги, указанные вами для вашего include_path
в PHP.ini, поэтому нет смысла использовать glob
.В вашем случае достаточно установить include_path
к
/path/to/includes/classes/system/
Тем самый быстрый способ включения файлов - использовать карта class2file.Однако для этого вам потребуется создать такую карту и обновлять ее при изменении приложения.
Другие советы
PHP уже решил эту проблему для вас. Используйте PHP Встроенный автозагрузчик. Отказ Никогда не катишь свой собственный, когда язык / Framework дает вам для вас.
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);
}
... Что еще не самым величайшим образом, но он приводит вас к использованию глобата (). Если вы обычно загружаете все свои подключения, там должен быть жесткий кодированный список () в скрипте загрузки / конфигурации. Есть много вариантов о том, как организовать и получать файлы классов. Чтобы уменьшить время поиска скриптов, вы могли бы подумать о вашем FileTreee как интерфейс. Для простоты вы можете поставить все не обязательные классы в той же папке, уменьшая вызовы IS_File () до одного.
В моей системе у меня есть классы объектов, сгруппированные в папках с соответствующими сценариями управления и представлениями. Моя функция __autoload () имеет более простую работу -
$classfile = $path.$class.'/'.$class.'_class.php';
if (is_file($classfile)) require_once($classfile);