Поддержка пространства имен в PHP 5.3. Примеры работы на ImageCMSИсточник: habrahabr develop3r
Последние пять лет в истории PHP отличаются впечатляющими изменениями. Этот язык программирования развивается гораздо быстрее в области веб-программирования - релиз РНР 5.4 имеет большинство функций, необходимых в работе с современным веб-языком. Обеспечение поддержки пространства имен - одна из них. Возможность не из новых (php 5.3), но мы использовали ее в своей работе впервые. Собственным практическим опытом и жаждем поделиться. Что касается значимости пространства имен конкретно для компании "ImageCMS" - сторонние разработчики модулей отныне имеют возможность создавать автономные модули. Ведь вопрос удобства написания модулей никогда не может и не должен быть закрыт полностью. Но в некой степени те или другие задачи могут быть решены.
Несколько слов о том, что натолкнуло нас на это решение.Скрипт ImageCMS работает на CodeIgniter. Фреймворк предлагал нам размешать свои библиотеки в " /application/libraries " и подключать к модулю с помощью Loader-класса. Такое ограничение заставляло писать мануалы по установке своего модуля с объяснением, куда размещать файлы для обеспечения работоспособности модуля. А если там уже есть файл с таким названием? Или имя класса? Нужно было заботиться об этом. Мы обратились в IRC с вопросом о том, планируется ли в ближайшее время поддержка пространства именcodeigniter.com/irc/. Ответ предоставлен не был. Та же ситуация ждала нас на странице Changelog - ни намека на то, что вскоре будет сделано шаг в данном направлении. Только на форуме некоторые наработки выложены пользователями и один коммит на https://github.com, который дает возможность унаследовать "CI_Controller" (CI_Model почему-то упустили). Тот приятный факт, что 25.05 мы перешли на РНР 5.3, дал нам возможность самим прописать эти несколько строк для реализации поддержки пространства имен.
Примеры внедрения namespace в систему ImageCMSПриведенный ниже пример - далеко не последний для релиза системы. Он будет еще не раз переписан, протестирован и оптимизирован, но представленный прототип дает возможность посмотреть один из вариантов реализации поддержки namespace в PHP-проекте. Добавим инициализацию в точку хука "pre_controller"
А вот, собственно, и сама инициализация
Теперь у нас есть возможность реагировать на подключение классов через namespace. Чтобы продемонстрировать принцип работы с пространством имен, приведем пример простого модуля, который подтягивает список пользователей с базы данных. Контроллер модуля
Дальше нам понадобится файл getuserlist.php с классом Getuserlist
Такой подход к проектированию классов многие сочтут неудачным. Хочется отделить работу с базой данных. Значит нам нужно переписать метод getUsers() таким образом, чтобы он передал работу с базой данных модели, тем самым абстрагироваться от процесса подтягивания информации. Новый метод теперь выглядит так:
ну и добавим псевдоним "Моdel":
Опишем модель для работы с базой данных:
Теперь у нас есть класс, логика которого закрыта для обработчика "Getuserlist", а значит - разработка и поддержка кода становится более легкой. Результат - написанный вами модуль может быть легко упакован в одну папку и выложен в магазине расширений с минимумом затрат по установке со стороны конечного пользователя. Раскрываются возможности для правильного построения иерархии классов и архитектурных конструкций. Ссылки по теме: |