CodeBlanks Logo Icon CodeBlanks

Anotasyon okuma

PHP kursu · Uzman · Ders 19/54

Doc comment ve #[] özniteliklerini reflection ile okumayı öğrenirsin.

PHP 8 öznitelikleri ve getAttributes

PHP 8'de öznitelikler (attributes) sınıf, method ve property'lere metadata ekler. Sözdizimi #[Route("/users")] biçimindedir; köşeli parantez içinde çağrı gibi yazılır.

Reflection ile bu öznitelikleri okursun. getAttributes() bir ReflectionAttribute dizisi döndürür. newInstance() öznitelik sınıfını kurucu argümanlarıyla örneklendirir.

Böylece method üzerindeki #[Route] etiketinden gerçek bir Route nesnesi elde edersin.

Öznitelik sınıfı tanımlama ve okuma

Bir öznitelik sınıfı tanımlamak için #[Attribute] ile işaretlersin. Kurucu parametreleri, özniteliğin taşıdığı veriyi belirler.

$attrs = $rm->getAttributes(); sana dizi verir. $attrs[0]->newInstance() Route nesnesini oluşturur; sonra ->path ile değeri okursun.

Eski usul doc-block yorumları için getDocComment() hâlâ kullanılır; ama öznitelikler tip güvenli ve yapılandırılmıştır.

Uygulama list methodunun #[Route] özniteliğini yazdır

Aşağıdaki UserController::list methodu #[Route("/users")] özniteliğiyle işaretli. Bir ReflectionMethod nesnesi oluştur ve getAttributes() ile her özniteliğin adını ayrı satıra yazdır.

Örnek çözümü göster
$rm = new ReflectionMethod("UserController", "list"); oluştur. foreach ($rm->getAttributes() as $attr) { echo $attr->getName() . "\n"; } ile yazdır.
Örnek çözüm:
<?php
#[Attribute]
class Route {
    public function __construct(public string $path) {}
}

class UserController {
    #[Route("/users")]
    public function list(): array {
        return [];
    }
}

$rm = new ReflectionMethod("UserController", "list");
foreach ($rm->getAttributes() as $attr) {
    echo $attr->getName() . "\n";
}

Kendini test et

  1. Öznitelik kavramlarını eşleştir

    #[Route]
    PHP 8 öznitelik sözdizimi
    getAttributes
    Öznitelik listesini döndürür
    newInstance
    Öznitelik sınıfını örneklendirir
    getDocComment
    Doc-block yorumunu döndürür
  2. getAttributes() ne döndürür?

    • Dize dizisi
    • ReflectionAttribute dizisi
    • ReflectionMethod dizisi
    • Tek bir ReflectionAttribute nesnesi
    Cevabı göster

    ReflectionAttribute dizisi — Doğru. Her öznitelik için bir ReflectionAttribute alırsın.

  3. getAttributes() ile döngü kur

    <?php
    $rm = new ReflectionMethod("UserController", "list");
    foreach ($rm->____() as $attr) {
        echo $attr->getName() . "\n";
    }
    
    Cevabı göster
    <?php
    $rm = new ReflectionMethod("UserController", "list");
    foreach ($rm->getAttributes() as $attr) {
        echo $attr->getName() . "\n";
    }
    

Uzman bölümündeki tüm dersler