Я начал изучать Symfony (4.1), и у меня есть вопрос об аннотациях.
Насколько мне известно, аннотации - это просто комментарии с точки зрения php, и они не являются частью самого языка. Однако они довольно мощная вещь в Symfony.
Я хочу знать, как все это работает.
Проще говоря, я хотел бы знать, как работают аннотации в Symfony, механизм этой функции.
Моя точка зрения или, скорее, дополнение к вопросу: обрабатывают ли эти библиотеки аннотации по-разному или есть центральный общий пакет, который все они используют под капотом?
Кто бы ни погуглил, все может измениться с введение атрибутов PHP8






Да, действительно, аннотации не являются частью самого языка. Но они также не являются частью фреймворка Symfony.
Аннотации обычно обрабатываются пакетом doctrine/annotations (наиболее распространенным). Он использует отражение для чтения и анализа этих комментариев и преобразования их в объекты аннотации (у каждой аннотации есть класс аннотации, которые он представляет).
Затем библиотека должна использовать сгенерированные объекты, представляющие эти аннотации.
Итак, чтобы ответить на первый вопрос - да, препроцессор есть. Но он не «создает новые объекты php», потому что это задача библиотеки, которая использует эти аннотации (например, фреймворк Symfony или Doctrine ORM).
Как это влияет на производительность, зависит от библиотеки, которая их использует. Если они будут анализироваться при каждом запросе, это действительно повлияет на производительность. Так, например, Symfony и Doctrine ORM кэшируют эти данные или создают прокси-классы и т. д.
Итак, ответ на второй вопрос - он может быть использован при неправильном использовании, но обычно это не так (в производственной среде), поскольку они просто не анализируются каждый раз.
Последний вопрос не имеет отношения к аннотациям. Поскольку аннотации на самом деле являются классами, причина их размещения в именах такая же. Чтобы избежать конфликтов между библиотеками и для удобства чтения.
Итак, я предполагаю, что под капотом doctrine/annotations будет использовать ReflectionProperty::getDocComment и co для доступа к информации в комментариях?
@Bananaapple: да, он использует getDocComment, но не только класса ReflectionProperty, но также ReflectionMethod и ReflectionClass, поскольку аннотации могут быть назначены классам и методам.
Я думаю, что это интересный вопрос, на который лично я не знаю ответа, но я знаю, что существуют разные типы аннотаций. Например, ORM доктрины может использовать аннотации, чтобы указать, как объект должен отображаться в таблице в базе данных, в то время как проверки Symfony могут использовать аннотации assert для обеспечения соблюдения правил проверки свойств объекта на уровне модели. Также интересно отметить, что аннотации не являются обязательными, и вы могли бы, по крайней мере, в Symfony 3, добиться того же, дополнив файлы XML, например, но аннотации, безусловно, кажутся более популярными в наши дни.