Как Drupal обрабатывает автозагрузку классов?
Вопрос
Как Drupal обрабатывает автозагрузку классов через модули? Например, если у меня есть модуль событий, и я объявляю класс с именем Event, а затем в файл .info я включаю файл класса, как это зарегистрировано?
Проблема в том, что я пытаюсь динамически получить массив, содержащий все загруженные имена классов. get_declared_classes () Не возвращает имена всех моих классов, объявленных таким образом, поэтому я предполагаю, что они как -то автоматически загружаются. Следуя предложениям из другого вопроса о переполнении стека, я попытался получить все их с помощью spl_autoload_functions (), но это также было безуспешным.
Любые идеи?
Решение
Все файлы, перечисленные в файлах .info, проанализированы при восстановлении модулей (по соображениям производительности, только изменяются/новые файлы в этом списке).
Эта информация затем хранится в {registry}
а также {registry_files}
столы. Поэтому, если вы хотите получить все классы или те, которые в соответствии с данной схемой именования, вы можете запросить эти таблицы.
Другие советы
Drupal поддерживает реестр кода и использует его для автозагрузки классов. Чтобы заполнить этот реестр классами вашего модуля, вы должны добавить их файлы в запись файлов [] в его файле .info:
files[] = includes/Foo.inc
files[] = includes/Bar.inc
Автопожавка класса PHP позаботится о том, чтобы файл родительского класса также загружен.
Заслуга пользователя-пирс-куклу за этот ответ, посмотрите на его Оригинальный ответ здесь за тот же вопрос.
надеюсь, это поможет
spl_autoload_functions()
возвращает список функций автозагрузки, которые были зарегистрированы в spl_autoload_register()
. Анкет Drupal регистрирует две функции автозагрузки: одна для классов (drupal_autoload_class ()) и один для интерфейсов (drupal_autoload_interface ()).
Обе функции используют _registry_check_code (); Используя свой код, вы можете написать функцию, которая перечисляет все классы, реализованные модулями Drupal 7.
Если вы добавили запись в массив файлов файлов. Это заставит Drupal обновить информацию .info, и новые записи будут зарегистрированы.
Я обнаружил, что объявление моих включенных файлов в файле информации не узнает их, когда я начинаю запускать модуль. Если у меня есть классное событие в файле event.inc. Но приготовьте объект в модуле, он не распознается. Я добавляю линию
include_once ('CMatArticleHandler.inc');
до $ variable = new Event (); линия. Я новичок в этом, так что это может быть больше, чем это, но это сработало до сих пор.