Атрибуты в PHP 8 предоставляют стандартизированный способ добавления метаданных к вашим классам, методам, свойствам и параметрам. Эти метаданные затем могут быть получены и использованы во время выполнения. Вот пример использования атрибута в PHP 8:
Определение атрибута: Сначала определим наш собственный атрибут, который можно будет применять. Назовём его Route, данный атрибут предназначен для упрощения создания простого маршрутизатора для веб-приложения.
#[Attribute(Attribute::TARGET_METHOD)]
class Route {
public function __construct(public string $path, public string $method = 'GET')
{
}
}
Применение атрибута: Затем применим этот атрибут к методу в нашем классе, который будет обрабатывать HTTP-запросы.
class WebController
{
#[Route('/home', method: 'GET')]
public function home()
{
return 'Добро пожаловать на главную страницу!';
}
#[Route('/about', method: 'GET')]
public function about()
{
return 'О нас';
}
}
Использование атрибутов в рантайме: Наконец, мы можем написать код, который читает эти атрибуты во время выполнения и использует их для решения, какой метод вызвать в зависимости от URL.
function handleRequest(string $uri): void
{
$controller = new WebController();
$refClass = new ReflectionClass($controller);
foreach($refClass->getMethods() as $method) {
$attributes = $method->getAttributes(Route::class);
foreach($attributes as $attribute) {
$route = $attribute->newInstance();
if ($route->path === $uri) {
echo $method->invoke($controller);
return;
}
}
}
echo "404 Not Found";
}
// Пример вызова
handleRequest('/about'); // Выведет: О нас
В данном примере мы создали атрибут Route, использовали его для аннотации методов в WebController, а затем написали функцию handleRequest, которая корректно вызывает нужный метод в зависимости от запрашиваемого URI.
Это простой пример, демонстрирующий мощь атрибутов PHP 8 в реализации метаданных и их использовании в рантайме для управления поведением приложения.