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]).