Ввод в рефлексию в PHP
lang_of_article_differ
want_proper_trans
Каждый php-разработчик хотя бы раз пытался разработать собственный фреймворк, используя такие классные слова, как mvc, active record, ORM, logger и так далее.
Кто-то добьется успеха в этой задаче, а кто-то нет. Если вы написали свой первый фреймворк, скорее всего, вам следует переписать его почти полностью, когда вы захотите какую-то новую функцию или измените поведение существующей.
Причина этого заключается в том, что компоненты вашей структуры тесно связаны друг с другом, и изменения в любой из них потребуют изменений в зависимых частях. Если вы хотите написать фреймворк с компонентами со слабой связью, то для достижения этого мало распространенных технических средств:
записывать реализацию компонентов на основе интерфейса или наследования, использовать сервисный локатор и / или внедрение зависимостей, когда возможно включить горячую замену компонентов и так далее.
И это та часть, где проявляется все величие отражения API. Используя API отражения, вы можете делать много вещей на фоне вашего реального кода: автоматически перетаскивать зависимые библиотеки в контроллеры, основанные на типах библиотек, получать все интерфейсы, которые реализует некоторый класс, получать все имена полей некоторого класса (особенно эффективно, когда вы Вы планируете написать ORM или какой-нибудь автоматически сгенерированный CRUD), получить информацию обо всех функциях класса и о некоторых.
Откровенно говоря, рефлексия позволяет вам даже больше, чем вы ожидали от нее: создавать экземпляры классов с закрытыми конструкторами, устанавливать значения приватных свойств и, конечно, читать их.
Особенно это заметно в рефлексии - она позволяет вам анализировать и получать все документы ваших классов: документы классов, документы свойств и методов. Используя данные документа, вы можете добиться еще большей гибкости при создании вашей системы. Например, вы можете записать в праве доступа к документу действия уровня контроллера и опустить дополнительный файл с правами доступа для всех действий. :
/**
* @AllowGroup('admins')
*/
pubic function indexAction() {
Можно много чего сказать об рефлексии в php, поэтому я решил разделить этот пост на несколько частей, в следующей части мы попробуем получим общие данные о каком-то классе: список его методов и полей.