PHP Reflection API
  • 427

Введение в PHP Reflection API.

Автор: admin | 08 июня (Пт.) 2018г. в 18ч.12м.

Reflection переводится как отражение.
И это название говорит само за себя. Методы PHP Reflection API
позволяют получать информацию о классе или его экземпляре, которая не доступна другим способом.

На первый взгляд это не похоже на то, что было бы особенно полезно. Тем не менее, Reflection
на самом деле является действительно интересным аспектом разработки программного обеспечения, и
это то, что вы, вероятно, будете часто затрагивать.

Итак, в этой части мы рассмотрим Reflection API, и вот основные темы статьи:
- Что такое Reflection API.
- Установка и настройка.
- Применение.
- Вывод.

Что такое Reflection API.

Reflection (отражение) - способность компьютерной программы исследовать, исследовать и изменять
свою собственную структуру и поведение во время выполнения.

Что значит возможность исследования кода? Посмотрим на фрагмент кода:
/**
 * Class Profile
 */
class Profile {
   /**
    * @return string
    */
   public function getUserName(): string
   {
      return 'Foo';
   }
}​

Класс Profile является черным ящиком. И если у нас нет доступа к коду, то посмотреть как
он устроен можно используя ReflectionClass:

// получаем объект
$reflectionClass = new ReflectionClass('Profile');

// получаем имя класса
var_dump($reflectionClass->getName());
=> output: string(7) "Profile"

// получаем комментарии
var_dump($reflectionClass->getDocComment());
=> output:
string(24) "/**
 * Class Profile
 */"

Итак, ReflectionClass похож на аналитика для нашего класса Profile, и это основная идея Reflection API.

PHP дает ключи к закрытым параметрам, поэтому мы можем получить доступ к ним с помощью:

ReflectionClass: сообщает информацию о классе.
ReflectionFunction: сообщает информацию о функции.
ReflectionParameter: извлекает информацию о параметрах функции или метода.
ReflectionClassConstant: сообщает информацию о константе класса.

Можно посмотреть полный список на php.net.

Установка и настройка

Чтобы использовать разные классы API Reflection, нет необходимости в установке или конфигурации,
она входит в состав ядра.

Использование.

Здесь у нас есть несколько примеров того, как мы можем использовать Reflection API:

Получить родительский класс для определенного класса:

// тут класс наследник
class Child extends Profile {
}

$class = new ReflectionClass('Child');

// тут список всех классов родителей
print_r($class->getParentClass()); // ['Profile']

Так можно получить докумментацию к методу getUserName():
    
$method = new ReflectionMethod('Profile', 'getUserName');
var_dump($method->getDocComment());
=> output:
string(33) "/**
 * @return string
 */"

Использование в качестве аналога instanceof и is_a () для проверки объектов:

$class = new ReflectionClass('Profile');
$obj   = new Profile();
var_dump($class->isInstance($obj)); // bool(true)
// same like
var_dump(is_a($obj, 'Profile')); // bool(true)
// same like
var_dump($obj instanceof Profile); // bool(true)

В некоторых ситуациях вы столкнетесь с модульным тестированием и возникнет
вопрос как я могу проверить приватные функции ?!
Не беспокойтесь, вот пример:

// обозначим getName() как private
private function getName(): string
{
    return 'Foo';
}
$method = new ReflectionMethod('Profile', 'getUserName');
// проверка, является ли метод приватным
if ($method->isPrivate()) {
    $method->setAccessible(true);
}
echo $method->invoke(new Profile()); // Foo  

Предыдущие примеры довольно просты, вот некоторые области, в которых вы можете найти
применение Reflection API на более продвинутом уровне:

- Генератор документации: пакет laravel-apidoc-generator, он широко использует ReflectionClass & ReflectionMethod, чтобы получить информацию о блоках doc классов и методов, а затем обработать их, проверить этот блок кода.
- Контейнер для внедрения зависимостей: вот статейка на тему DI Container.

Вывод

PHP предоставляет богатый API Reflection, который облегчает жизнь в любой области ООП.
PHP Reflection это инструменты который позволяет программно заглянуть внутрь класса и получить много информации.

Приветствую!

Меня зовут Сергей. Я - автор этого блога.

Если Вам был полезен материал на моем сайте, поддержите пожалуйста мой проект, чтобы о нем узнали другие люди - кликните plizz :) на иконку в соц. сети, чтобы поделиться материалом с другими.