Anotasyon okuma
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
-
Ö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
-
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.
-
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"; }