DEV Community

Cover image for PHP Attributes: Modern Metadata in Your Code
Hamid Haghdoost
Hamid Haghdoost

Posted on

PHP Attributes: Modern Metadata in Your Code

Since PHP 8, we’ve had attributes — a modern way to add metadata directly to classes, methods, or properties. Think of them like annotations in Java or decorators in Python.


🔖 What are attributes?

Attributes let you “tag” parts of your code with extra information. Frameworks or libraries can then read these tags at runtime and act on them.

Example:

#[Route('/home', methods: ['GET'])]
class HomeController {
    // ...
}
Enter fullscreen mode Exit fullscreen mode

Here, the Route attribute describes how this controller should be exposed.


⚙️ How do you define an attribute?

Attributes are just classes marked with #[Attribute].

use Attribute;

#[Attribute]
class Route {
    public function __construct(
        public string $path,
        public array $methods = ['GET']
    ) {}
}
Enter fullscreen mode Exit fullscreen mode

🔍 How to read attributes with Reflection

You can fetch and use attributes at runtime via the Reflection API:

$reflection = new ReflectionClass(HomeController::class);

// Get all attributes on the class
foreach ($reflection->getAttributes(Route::class) as $attr) {
    // Turn attribute into a real object
    $route = $attr->newInstance();

    echo $route->path;     // "/home"
    echo implode(',', $route->methods); // "GET"
}
Enter fullscreen mode Exit fullscreen mode

This is how frameworks like Symfony or Doctrine process metadata and apply logic automatically.


✅ Why use attributes?

  • Cleaner than PHPDoc comments
  • More flexible than marker interfaces
  • Supported natively by PHP, no hacks needed

🏛️ Where are they used?

  • Symfony#[Route] for controllers
  • Doctrine ORM#[Entity], #[Column] for database mapping
  • Custom apps → logging, caching, validation rules

🔑 In short: Attributes bring structured, modern metadata to PHP. They’re concise, powerful, and built right into the language — and with reflection, they let your code adapt based on annotations.

Top comments (0)