Atribute Native în PHP 8 (#[Attribute]) în PHP

Înlocuirea comentariilor PHPDoc cu metadate native de prim rang în limbaj: cum definești și citești atribute prin Reflection API.

Sintaxă
#[Route('/api/utilizatori', methods: ['GET'])] public function lista(): Response

Atributele native (cunoscute în alte limbaje precum Java sau C# drept adnotări sau decoratori) oferă o modalitate nativă, verificată sintactic de compilator, de a atașa metadate claselor, metodelor, funcțiilor sau proprietăților. Înainte de PHP 8, framework-urile (Symfony, Doctrine, Laravel) erau obligate să parseze textul din comentariile PHPDoc (/** @Route(...) */) prin expresii regulate lente și predispuse la erori de tastare.

Definirea și utilizarea unui atribut nativ
<?php

declare(strict_types=1);

// 1. Declararea unei clase ca atribut prin atributul nativ #[Attribute]
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION)]
class RutaApi {
    public function __construct(
        public string $cale,
        public string $metoda = 'GET'
    ) {}
}

// 2. Utilizarea atributului pe metodele unui controller
class UtilizatorController {
    #[RutaApi(cale: '/api/v1/utilizatori', metoda: 'GET')]
    public function obtineToti(): array {
        return ['status' => 'ok'];
    }
}

// 3. Citirea atributelor prin Reflection API
$reflector = new ReflectionMethod(UtilizatorController::class, 'obtineToti');
$atribute = $reflector->getAttributes(RutaApi::class);

foreach ($atribute as $atribut) {
    $instanta = $atribut->newInstance();
    echo "Ruta găsită: [{$instanta->metoda}] {$instanta->cale}";
}
// Output: Ruta găsită: [GET] /api/v1/utilizatori

Unde se utilizează intensiv în ecosistemul modern

  • Rute HTTP: Definirea endpoint-urilor direct deasupra metodelor din controllere în Symfony și Laravel.
  • Mapare ORM (Doctrine): Definirea coloanelor de tabel (#[ORM\Column(type: 'string')]).
  • Validare date: Reguli de constrângere pe proprietăți (#[Assert\NotBlank], #[Assert\Email]).