Sınıf tür bildirimi
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
-
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
-
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.
-
Tür bildirimini tamamla
public function __construct(____ $engine) { $this->engine = $engine; }Cevabı göster
public function __construct(Engine $engine) { $this->engine = $engine; }