Библиотека Reflection в PHP
Reflection API рефлексия в контексте программирования, это процесс при котором программа может наблюдать и модифицировать свою собственную структуру и поведение во время выполнения.
Классы
Reflection API позволяют узнать всю информацию о классе, функции, методе, исключениях, для этого есть ряд наследников:
ReflectionClass ()
Класс ReflectionClass() предоставляет методы, которые собирают информацию обо всех аспектах заданного класса, в качестве единственного аргумента передается экземпляр класса:
$classInfo = new ReflectionClass(object имя_обьекта) : object
ReflectionObject ()
Расширяет класс ReflectionClass и предоставляет информацию об объекте, в качестве единственного аргумента передается экземпляр класса:
$objectInfo = new ReflectionObject(object имя_обьекта) : object
ReflectionMethod ()
Представляет информацию о методе класса и позволяет вызывать его, в качестве аргумента передается экземпляр класса и название метода:
$methodInfo = new ReflectionMethod(object имя_обьекта, string имя_метода) : object
ReflectionProperty ()
Представляет информацию о свойстве класса и позволяет взаимодействовать с ним, в качестве аргумента передается экземпляр класса и название свойства:
$propertyInfo = new ReflectionProperty(object имя_обьекта, string имя_свойства) : object
ReflectionFunction ()
Представляет информацию о функции и позволяет вызывать ее, в качестве единственного аргумента передается имя функции:
$functionInfo = new ReflectionFunction(string имя_функции) : object
ReflectionParameter ()
Представляет информацию о параметре функции или метода и позволяет получать его характеристики, первый параметр, массив содержащий название класса и название метода, второй параметр, порядковый номер параметра который нам нужен:
$parameterInfo = new ReflectionParameter([string имя_класса, string имя_метода], int порядковый_номер_параметра) : object
ReflectionClassConstant ()
Представляет информацию по элементам перечисления enum:
$constantInfo = new ReflectionClassConstant(
class: string имя_класса,
constant: string имя_константы,
);
ReflectionException ()
Исключение, которое может быть выброшено в процессе работы с Reflection API.
Как это работает
Убедитесь, что расширение Reflection API включено в вашей установке PHP. Проверить это можно, выполнив следующий PHP-код:
<?php
phpinfo();
Для начала нужно создать экземпляр класса ReflectionClass, передав в качестве параметра имя класса:
<?php
#[TestAttribute(123)]
class MyClass
{
public $property1 = "I'm a public property!";
protected $property2 = "I'm a protected property!";
private $property3 = "I'm a private property!";
public function method1()
{
return "I'm a public method!";
}
protected function method2()
{
return "I'm a protected method!";
}
private function method3()
{
return "I'm a private method!";
}
}
$reflectionClass = new ReflectionClass('MyClass');
// выводим имя класса
echo "Class name: " . "<br>" . $reflectionClass->getName() . "<br>";
// выводим информацию о свойствах класса
echo "Properties:" . "<br>";
foreach ($reflectionClass->getProperties() as $property) {
echo " - " . $property->getName() . "<br>";
}
// выводим информацию о методах класса
echo "Methods:" . "<br>";
foreach ($reflectionClass->getMethods() as $method) {
echo " - " . $method->getName() . "<br>";
}
// выводим атрибуты
echo "Attribute:" . "<br>";
foreach ($reflectionClass->getAttributes() as $attribute) {
// полное имя атрибута
var_dump(" - " . $attribute->getName());
// параметры атрибута
var_dump(" - " . $attribute->getArguments());
// возвращает экземпляр new TestAttribute(), для этого должен быть создан атрибут
var_dump($attribute->newInstance());
}
// экземпляр класса
var_dump($reflectionClass->newInstance());