Рефлексия (Reflection) – это механизм анализа классов, методов, свойств и других структур во время выполнения. Она позволяет получать информацию о коде и даже изменять его динамически.
🚩Когда полезна рефлексия?
🟠Фреймворки и DI-контейнеры
- Используется для автоматического внедрения зависимостей (Dependency Injection, DI).
- Например, Laravel использует рефлексию в
Container для автоматического создания объектов. class Database {
public function connect() {
return "Подключение к базе данных";
}
}
class UserService {
private $db;
public function __construct(Database $db) {
$this->db = $db;
}
public function getUser() {
return "Пользователь найден";
}
}
function resolve($class) {
$reflector = new ReflectionClass($class);
$constructor = $reflector->getConstructor();
if (!$constructor) {
return new $class;
}
$params = $constructor->getParameters();
$dependencies = [];
foreach ($params as $param) {
$type = $param->getType();
if ($type) {
$dependencies[] = resolve($type->getName());
}
}
return $reflector->newInstanceArgs($dependencies);
}
$service = resolve(UserService::class);
echo $service->getUser(); // "Пользователь найден"🟠Декораторы, аннотации и атрибуты
- В PHP 8 появились атрибуты (аннотации), и рефлексия помогает их читать.
- Используется в Symfony, Doctrine для работы с ORM.
#[Attribute]
class Route {
public function __construct(public string $path) {}
}
class Controller {
#[Route('/home')]
public function home() {
return "Домашняя страница";
}
}
$reflection = new ReflectionMethod(Controller::class, 'home');
$attributes = $reflection->getAttributes(Route::class);
$route = $attributes[0]->newInstance();
echo $route->path; // "/home"
🟠Автоматическая генерация документации
- Реально использовать для автоматического создания Swagger/OpenAPI.
- Можно извлекать PHPDoc-комментарии и на их основе генерировать документацию.
class Example {
/**
* Возвращает приветствие
* @return string
*/
public function sayHello() {
return "Привет!";
}
}
$reflection = new ReflectionMethod(Example::class, 'sayHello');
echo $reflection->getDocComment();Ставь 👍 и забирай 📚 Базу знаний