Импорт пакета или автозагрузка для PHP?
-
03-07-2019 - |
Вопрос
Какое решение вы бы порекомендовали для включения файлов в PHP-проект?
- Нет ручных вызовов функций require / include - все загружается через функции автозапуска
- Импорт пакетов, когда это необходимо.
Вот API для импорта пакетов:
import('util.html.HTMLParser');
import('template.arras.*');
В этом объявлении функции вы можете разбить строку на точки (разделитель иерархии пакетов), просматривая файлы в конкретном пакете (папке), чтобы включить только один из них или все из них, если символ звездочки находится в конце строки, например('template.arras.*').
Одно из преимуществ, которое я вижу в методе импорта пакетов, заключается в том, что он может заставить вас использовать лучшую декомпозицию объектов и группировку классов.
Один из недостатков, которые я вижу в методе автоматической загрузки, заключается в том, что функция автоматической загрузки может стать очень большой и не очень очевидной / читаемой.
Что вы думаете по этому поводу?
- Какие преимущества / недостатки вы можете назвать в каждом из этих методов?
- Как я могу найти наилучшее решение для проекта?
- Как я могу узнать, возникнут ли какие-либо проблемы с производительностью при использовании управления пакетами?
Решение
Я широко использую __автозагрузку().Функция autload, которую мы используем в нашем приложении, имеет несколько настроек для обеспечения обратной совместимости со старыми классами, но обычно мы следуем соглашению при создании новых классов, которые позволяют autoload() работать довольно незаметно:
- Согласованное Именование класса:каждый класс находится в своем собственном файле, каждый класс имеет имя в верблюжьем регистре, разделенное символом подчеркивания.Это соответствует пути к классу.Например, Some_CoolClass сопоставляется с нашим каталогом классов, затем 'Some/CoolClass.class.php '.Я думаю, что некоторые фреймворки используют это соглашение.
- Явно требовать внешних классов:поскольку у нас нет контроля над именованием каких-либо внешних библиотек, которые мы используем, мы загружаем их с помощью функции require_once() PHP.
Другие советы
Метод импорта является улучшением, но по-прежнему загружает больше, чем необходимо.
Либо используя звездочку, либо загружая их в начале скрипта (поскольку импорт перед каждым "новым именем класса" станет громоздким)
Я фанат __autoload()
или чем еще лучше spl_autoload_register()
Потому что он будет включать только те классы, которые вы используете, и дополнительное преимущество в том, что вам все равно, где находится класс.Если ваш колледж перемещает файл в другой каталог, на вас это не влияет.
Недостатком является то, что для этого требуется дополнительная логика чтобы заставить его правильно работать с каталогами.
Я использую require_once("../path-to-auto-load-script.php.inc") с автоматической загрузкой
У меня есть стандартное соглашение об именовании для всех классов и inc-файлов, которое упрощает программное определение того, какое имя класса запрашивается в данный момент.
например, все классы имеют определенное расширение, например inc.php
(итак, я знаю, что они будут в каталоге / cls)
и
все файлы inc начинаются с .ht (поэтому они будут находиться в каталоге /inc)
автоматическая загрузка принимает один параметр:className, которое я затем использую, чтобы определить, где на самом деле находится файл.повторяю цикл, как только я узнаю, каков мой целевой каталог, каждый раз добавляя ".. /" для учета вложенных страниц (что, казалось, нарушало автоматическую загрузку для меня) и, наконец, require_once'ing фактический файл кода после его нахождения.
Я настоятельно рекомендую вместо этого сделать следующее:
Поместите все ваши классы в статический массив, имя_класса => путь к файлу/classFile.Функция автоматической загрузки может использовать это для загрузки классов.
Это гарантирует, что вы всегда загружаете минимальное количество файлов.Это также означает, что вы избегаете совершенно глупых имен классов и синтаксического анализа указанных имен.
Если это медленно, вы можете включить какой-нибудь ускоритель, и это даст вам намного больше, если это все еще медленно, вы можете запустить процесс "компиляции", в котором часто используемые файлы просто сбрасываются в обычные файлы, а ссылки на автозагрузку могут быть обновлены, чтобы указать правильное место.
Если вы начнете сталкиваться с проблемами, из-за которых ваша автозагрузка происходит слишком медленно, во что мне трудно поверить, вы можете разделить это по пакетам и использовать несколько функций автозагрузки, таким образом, требуются только подмножества массива, это работает лучше всего, если ваши пакеты определены вокруг модулей вашего программного обеспечения (логин, администратор, электронная почта, ...)
Я не являюсь поклонником __autoload()
.Во многих библиотеках (например, в некоторых библиотеках PEAR) разработчики используют class_exists()
без передачи относительно нового второго параметра.Любой существующий у вас устаревший код также может иметь эту проблему.Это может вызвать предупреждения и ошибки, если у вас есть __autoload()
определенный.
Однако, если ваши библиотеки понятны и вам не нужно иметь дело с устаревшим кодом, это фантастический инструмент.Иногда я жалею, что PHP не был немного умнее в том, как они управляли поведением class_exists()
, потому что я думаю , что проблема заключается в этой функциональности , а не __autoload()
.
Создание собственной упаковочной системы, вероятно, является плохой идеей.Я бы посоветовал вам использовать явное включение вручную или автозагрузку (или их комбинацию, если уж на то пошло).