Özet - Reflection
ReflectionClass, ReflectionMethod ve özniteliklerle basit bir DI container yazarsın.
Özet - Basit bir DI container
Basit bir bağımlılık container'ı yazmak için tüm reflection araçlarını birleştiririz. ReflectionClass sınıfı açar, getConstructor() kurucuyu bulur, getParameters() bağımlılıkları listeler.
Her parametre için uygun sınıfı örneklendirip newInstanceArgs() ile kurucuya geçersin. #[Inject] gibi öznitelikler hangi parametrenin otomatik çözüleceğini işaretler.
Bu dersin sonunda Container::make("Logger") çağrısı hazır bir nesne döndürecek.
Uygulama Container::make ile Logger örneği oluştur
Aşağıdaki Container::make iskeleti verilmiş. ReflectionClass ile $class'ı incele, getConstructor() ile kurucuyu al; null ise new $class döndür. Kurucu varsa newInstanceArgs([]) ile örneği oluştur ve döndür.
Örnek çözümü göster
$rc = new ReflectionClass($class); oluştur. $ctor = $rc->getConstructor(); ile kurucuyu al. if ($ctor === null) { return new $class; } return $rc->newInstanceArgs([]); ile bitir.
Örnek çözüm:
<?php
class Logger {
public function __construct(public string $name = "app") {}
}
class Container {
public static function make(string $class): object {
$rc = new ReflectionClass($class);
$ctor = $rc->getConstructor();
if ($ctor === null) {
return new $class;
}
return $rc->newInstanceArgs([]);
}
}
$logger = Container::make("Logger");
echo $logger->name . "\n";
Kendini test et
-
Container bağımlılıkları çözerken ne kullanır?
- Yalnız getName()
- getMethods() ve getProperties()
- getConstructor() ve getParameters()
- Yalnız getShortName()
Cevabı göster
getConstructor() ve getParameters() — Doğru. Kurucu ve parametreleri çözmek bu iki methodla yapılır.
-
getConstructor çağrısını tamamla
<?php $rc = new ReflectionClass($class); $ctor = $rc->____(); if ($ctor === null) { return new $class; }Cevabı göster
<?php $rc = new ReflectionClass($class); $ctor = $rc->getConstructor(); if ($ctor === null) { return new $class; } -
Container parçalarını eşleştir
- getConstructor
- Kurucu methodu bulur
- getParameters
- Kurucu parametrelerini verir
- newInstanceArgs
- Örneği argümanlarla oluşturur
- #[Inject]
- Bağımlılık işaretçisi