CodeBlanks Logo Icon CodeBlanks

Sınıf tür bildirimi

PHP kursu · Orta seviye · Ders 10/115

Yapıcı parametresine sınıf türü bildirip yalnızca o sınıfı kabul etmeyi öğrenirsin.

Sınıf tür bildirimi

Bir yapıcı parametresine tür bildirimi (type declaration) eklersen PHP, yalnızca o türdeki değerleri kabul eder. Sınıf adını tür olarak yazdığında parametre yalnızca o sınıfın örneklerini alır:

class Engine {
    public function start(): void {
        echo "Çalıştı\n";
    }
}

class Car {
    public function __construct(Engine $engine) {
        $this->engine = $engine;
    }
}

Burada Engine $engine, parametrenin yalnızca Engine sınıfından bir örnek olabileceğini söyler. Yanlış tür geçersen PHP TypeError fırlatır. Bu yaklaşım, bir sınıfın başka bir sınıfa ihtiyaç duymasını açıkça gösterir ve bağımlılık enjeksiyonu (dependency injection) olarak adlandırılır.

Bağımlılık enjeksiyonu

Bir sınıf işini yaparken başka bir sınıfa ihtiyaç duyuyorsa, bu ihtiyacı yapıcı parametresi olarak dışarıdan almak en temiz yoldur. Buna bağımlılık enjeksiyonu denir.

$engine = new Engine();
$car = new Car($engine);

Burada önce Engine örneğini oluşturur, sonra Car örneğine geçirirsin. Böylece Car sınıfı kendi içinde Engine oluşturmaz; dışarıdan geleni kullanır. Bu, kodu test etmeyi kolaylaştırır: test sırasında sahte (mock) bir Engine verebilirsin.

Tür bildirimi olmadan yanlışlıkla bir dizi veya dize geçebilirsin; tür bildirimi bu hatayı önler.

Uygulama Logger ve Service ile bağımlılık enjeksiyonu

İki sınıf tanımla. Birincisi Logger: public function log(string $message): void metodu olsun ve gövdede echo "[LOG] " . $message . "\n"; yazsın. İkincisi Service: public $logger; özelliğini bildirsin; yapıcı __construct(Logger $logger) imzasıyla Logger örneği alsın, $this->logger = $logger; atamasını yapsın. Sınıfın dışında $logger = new Logger();, $service = new Service($logger); ve $service->logger->log("Service hazır"); çağrılarını yap.

Örnek çözümü göster
void { echo "[LOG] " . $message . "\n"; }. Service içinde public $logger; ve public function __construct(Logger $logger) { $this->logger = $logger; }. Sonra $logger = new Logger();, $service = new Service($logger); ve $service->logger->log("Service hazır");.
Örnek çözüm:
<?php
// Logger ve Service sınıflarını tanımla
class Logger {
    public function log(string $message): void {
        echo "[LOG] " . $message . "\n";
    }
}

class Service {
    public $logger;

    public function __construct(Logger $logger) {
        $this->logger = $logger;
    }
}

$logger = new Logger();
$service = new Service($logger);
$service->logger->log("Service hazır");

Kendini test et

  1. Kavramları eşle

    Engine $engine
    sınıf türü parametresi
    TypeError
    yanlış tür hatası
    new Car($engine)
    bağımlılığın geçirilmesi
    dependency injection
    dışarıdan bağımlılık verme
  2. Engine $engine tür bildirimi ne sağlar?

    • Parametrenin her türlü değer alabilmesini
    • Parametrenin yalnızca Engine örneği olabilmesini
    • Parametrenin dizi olmasını
    • Parametrenin null olmasını
    Cevabı göster

    Parametrenin yalnızca Engine örneği olabilmesini — Doğru. Sınıf adı tür bildirimi, parametreyi yalnızca o sınıfın örnekleriyle sınırlandırır.

  3. Tür bildirimini tamamla

        public function __construct(____ $engine) {
            $this->engine = $engine;
        }
    Cevabı göster
        public function __construct(Engine $engine) {
            $this->engine = $engine;
        }

Orta seviye bölümündeki tüm dersler