En Symfony 7.2 se ha introducido un componente llamado TypeInfo, con la intención de reemplazar al componente PropertyInfo. El cual se usa para obtener información de propiedades de clases PHP. El principal inconveniente de PropertyInfo es que solo obtiene información de las propiedades, nada de métodos, sus argumentos o el tipo que va a devolver. Principal razón por la que se ha creado el componente TypeInfo.
Instalamos el componente
composer require symfony/type-info
Hay 2 maneras de usar el componente
El componente nos ofrece un objeto Type que vamos a utilizar para determinar de lo que quiera que queremos leer sus tipos. Podemos crear nuevas instancias de tipo mediante los métodos estáticos de la clase Type
use Symfony\Component\TypeInfo\Type;
Type::int();
Type::list(Type::bool());
También podemos usar un TypeResolver al que le podemos pasar una reflection o un string con el nombre del tipo
use Symfony\Component\TypeInfo\TypeResolver\TypeResolver;
$typeResolver = TypeResolver::create();
$typeResolver->resolve('bool');
$typeResolver->resolve(new \ReflectionProperty(ClassName::class, 'propertyName'));
En cualquier caso vamos a obtener una instancia de Type
Si además instalamos el paquete phpdoc-parser mediante el comando
composer require phpstan/phpdoc-parser
Podremos resolver tipos que han sido definidos con PHPDocs
use Symfony\Component\TypeInfo\TypeResolver\TypeResolver;
class Foo
{
public function __construct(
/** @var string[] $list */
public array $list,
) {
}
}
$typeResolver = TypeResolver::create();
$typeResolver->resolve(new \ReflectionProperty(Foo::class, 'list'));
Esto nos devolverá un Type que indicará una colección con int como clave y string como el tipo de los valores,
Una vez que tenemos una instancia de Type ya podemos consultar sus propiedades
$type->getBaseType();
$type->isIdentifiedBy(TypeIdentifier::INT);
$type->getCollectionKeyType();
$type->isNullable();