CodeBlanks Logo Icon CodeBlanks

Özet - Reflection

PHP kursu · Uzman · Ders 21/54

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

  1. 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.

  2. 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; }
    
  3. 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

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