Новое в Symfony 7.1: Компонент TypeInfo
Это первая статья из цикла, рассказывающего о наиболее важных новых возможностях Symfony 7.1, который выйдет в конце мая 2024 года.
- Pull Request: [TypeInfo] Introduce component #52510 Mathias Arlaud и Baptiste Leduc
Компонент PropertyInfo извлекает информацию о типах свойств PHP-классов, используя метаданные из PHP reflection, Doctrine, PHPDoc, PHPStan и т.д.
readonly class Person
{
public function __construct(
public string $firstName,
) {
}
}
$types = $propertyInfo->getTypes(Person::class, 'firstName');
/*
$types = array(1) {
[0] =>
class Symfony\Component\PropertyInfo\Type (6) {
private $builtinType => string(6) "string"
private $nullable => bool(false)
private $class => NULL
private $collection => bool(false)
private $collectionKeyType => NULL
private $collectionValueType => NULL
}
}
*/
Этот компонент хорошо работает, но у него есть два существенных ограничения:
- Он не может правильно описать объединения типов, пересечения или дженерики (это частично решается возвращением массива объектов
Type
); - Он может получить информацию о типе только из свойств, но не из аргументов метода, возвращаемых типов и необработанных строк.
Поэтому в Symfony 7.1 мы представляем новый компонент TypeInfo для решения этих проблем. Первая проблема решается путём определения иерархии классов для описания типов (в будущем она будет расширена за счёт новых классов, когда PHP добавит новые возможности, связанные с типами):
Symfony\Component\TypeInfo\Type
├─ BuiltinType
├─ UnionType
├─ IntersectionType
├─ GenericType
├─ Template
└─ ObjectType
└─ EnumType
└─ BackedEnumType
Вторая проблема решается с помощью ряда экстракторов информации о типах, работающих не только со свойствами классов (ReflectionReturnTypeResolver
для получения возвращаемых типов с помощью отражения PHP; StringTypeResolver
для получения информации о типах с помощью аннотаций PHPDoc и т. д.).
Компонент был представлен в качестве экспериментальной функции (это означает, что API может немного измениться, прежде чем он будет признан стабильным), но он уже используется в компоненте PropertyInfo. В будущих версиях Symfony мы откажемся от класса Type из PropertyInfo и всех связанных с ним функций в пользу нового класса Type из компонента TypeInfo.