Новое в Symfony 7.1: Компонент TypeInfo

Источник: «New in Symfony 7.1: TypeInfo Component»
В Symfony 7.1 добавлен новый компонент TypeInfo, извлекающий информацию о PHP типе из нескольких элементов (свойства и методы классов, возвращаемые типы функций и методов и т.д.)

Это первая статья из цикла, рассказывающего о наиболее важных новых возможностях Symfony 7.1, который выйдет в конце мая 2024 года.

Компонент 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
}
}
*/

Этот компонент хорошо работает, но у него есть два существенных ограничения:

Поэтому в 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.

Дополнительные материалы

Предыдущая Статья

Новое в Symfony 7.1

Следующая Статья

Новое в Symfony 7.1: Атрибут IsCsrfTokenValid