PHP Attributes add metadata to classes and methods using #[AttributeName] syntax. Frameworks use them for routing and validation configuration. They are a cleaner replacement for configuration in docblock comments.
PHP 8 Attributes
#[Attribute]
class Route {
public function __construct(
public string $path,
public array $methods = ["GET"]
) {}
}
#[Attribute]
class Inject {}
// Usage
#[Route("/api/users", methods: ["GET", "POST"])]
class UserController {
#[Inject]
private UserService $service;
#[Route("/api/users/{id}")]
public function show(int $id): void {}
}
// Reading attributes via Reflection
$ref = new ReflectionClass(UserController::class);
$attrs = $ref->getAttributes(Route::class);
foreach ($attrs as $attr) {
$route = $attr->newInstance();
echo $route->path; // /api/users
}