Механизм аннотаций в Symfony - как все это работает?

Я начал изучать Symfony (4.1), и у меня есть вопрос об аннотациях.

Насколько мне известно, аннотации - это просто комментарии с точки зрения php, и они не являются частью самого языка. Однако они довольно мощная вещь в Symfony.

Я хочу знать, как все это работает.

  • Есть ли препроцессор кода, который динамически анализирует исходные файлы и создает новые объекты php?
  • Но если это так, то как это влияет на производительность приложения?
  • Почему я должен использовать специальные пространства имен для определенных аннотаций?

Проще говоря, я хотел бы знать, как работают аннотации в Symfony, механизм этой функции.

Я думаю, что это интересный вопрос, на который лично я не знаю ответа, но я знаю, что существуют разные типы аннотаций. Например, ORM доктрины может использовать аннотации, чтобы указать, как объект должен отображаться в таблице в базе данных, в то время как проверки Symfony могут использовать аннотации assert для обеспечения соблюдения правил проверки свойств объекта на уровне модели. Также интересно отметить, что аннотации не являются обязательными, и вы могли бы, по крайней мере, в Symfony 3, добиться того же, дополнив файлы XML, например, но аннотации, безусловно, кажутся более популярными в наши дни.

Bananaapple 17.10.2018 10:25

Моя точка зрения или, скорее, дополнение к вопросу: обрабатывают ли эти библиотеки аннотации по-разному или есть центральный общий пакет, который все они используют под капотом?

Bananaapple 17.10.2018 10:25

Кто бы ни погуглил, все может измениться с введение атрибутов PHP8

aexl 12.06.2021 19:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
9
3
798
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, действительно, аннотации не являются частью самого языка. Но они также не являются частью фреймворка Symfony.

Аннотации обычно обрабатываются пакетом doctrine/annotations (наиболее распространенным). Он использует отражение для чтения и анализа этих комментариев и преобразования их в объекты аннотации (у каждой аннотации есть класс аннотации, которые он представляет). Затем библиотека должна использовать сгенерированные объекты, представляющие эти аннотации.

Итак, чтобы ответить на первый вопрос - да, препроцессор есть. Но он не «создает новые объекты php», потому что это задача библиотеки, которая использует эти аннотации (например, фреймворк Symfony или Doctrine ORM).

Как это влияет на производительность, зависит от библиотеки, которая их использует. Если они будут анализироваться при каждом запросе, это действительно повлияет на производительность. Так, например, Symfony и Doctrine ORM кэшируют эти данные или создают прокси-классы и т. д.

Итак, ответ на второй вопрос - он может быть использован при неправильном использовании, но обычно это не так (в производственной среде), поскольку они просто не анализируются каждый раз.

Последний вопрос не имеет отношения к аннотациям. Поскольку аннотации на самом деле являются классами, причина их размещения в именах такая же. Чтобы избежать конфликтов между библиотеками и для удобства чтения.

Итак, я предполагаю, что под капотом doctrine/annotations будет использовать ReflectionProperty::getDocComment и co для доступа к информации в комментариях?

Bananaapple 17.10.2018 10:48

@Bananaapple: да, он использует getDocComment, но не только класса ReflectionProperty, но также ReflectionMethod и ReflectionClass, поскольку аннотации могут быть назначены классам и методам.

Jakub Matczak 17.10.2018 10:54

Другие вопросы по теме