PHP является слабо типизированный языком программирования. Это означает, что вам не надо объявить тип переменных (например, INT, BOOL), и вы можете хранить различные виды данных (например, числа и строки) в одной и той же переменной.
Разработчики частично пытаются преодолеть это ограничение посредствам комментариев PHPDoc, также начиная с PHP 7 будет доступено возвращение типизированного значения. Тем не менее, в некоторых случаях по-прежнему необходимо знать тип в PHP. Вот почему Symfony добавил новый компонент под названием PropertyInfo.
Этот компонент получает информацию о свойствах класса от нескольких поставщиков метаданных, таких как: Doctrine ORM аннотации, PHPDoc комментарии, PHP type, сериализатор метаданных, и т.д.
Рассмотрим следующий PHP класс сущности доктрины, которая содержит различные типы свойств:
namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @Entity */ class FooClass { /** * @ORM\Id * @ORM\Column(type="integer") */ public $id; /** * This is a date (short description). * * With a long description. * * @var \DateTime */ public $foo; private $bar; public function setBar(\SplFileInfo $bar) { $this->bar = $bar; } }
Перед использованием компонента PropertyInfo для извлечения информации, необходимо создать и настроить экстракторы метаданных (ReflectionExtractor, PhpDocExtractor, DoctrineExtractor и SerializerExtractor встроены, но вы можете создавать также свои собственные экстракторы):
use Symfony\Component\PropertyInfo\PropertyInfo; $propertyInfo = new PropertyInfo( array($reflectionExtractor), array($doctrineExtractor, $phpDocExtractor, $reflectionExtractor), array($phpDocExtractor), array($reflectionExtractor) );
Теперь вы можете проанализировать каждое свойство следующим образом:
$propertyInfo->getTypes('FooClass', 'foo'); // array(1) { // [0] => // class Symfony\Component\PropertyInfo\Type#36 (6) { // private $builtinType => string(6) "object" // private $nullable => bool(false) // private $class => string(8) "DateTime" // private $collection => bool(false) // private $collectionKeyType => NULL // private $collectionValueType => NULL // } // } $propertyInfo->getTypes('FooClass', 'id'); // array(1) { // [0] => // class Symfony\Component\PropertyInfo\Type#36 (6) { // private $builtinType => string(3) "int" // private $nullable => bool(false) // private $class => NULL // private $collection => bool(false) // private $collectionKeyType => NULL // private $collectionValueType => NULL // } // } $propertyInfo->getTypes('FooClass', 'bar'); // array(1) { // [0] => // class Symfony\Component\PropertyInfo\Type#245 (6) { // private $builtinType => string(6) "object" // private $nullable => bool(false) // private $class => string(11) "SplFileInfo" // private $collection => bool(false) // private $collectionKeyType => NULL // private $collectionValueType => NULL // } // }
Данный компонент включает другие утилиты для извлечения полезной информации:
$propertyInfo->getProperties('FooClass'); // ['id', 'foo', 'Bar'] $propertyInfo->isReadable('FooClass', 'id'); // true $propertyInfo->isReadable('FooClass', 'bar'); // false $propertyInfo->isWritable('FooClass', 'foo'); // true $propertyInfo->isWritable('FooClass', 'bar'); // true $propertyInfo->getShortDescription('FooClass', 'foo'); // "This is a date (short description)." $propertyInfo->getLongDescription('FooClass', 'foo'); // "With a long description." Источник: http://symfony.com/blog/new-in-symfony-2-8-propertyinfo-component