Giriş: Yazılım Sadece Kod Yazmak Değildir
Bir inşaat mühendisi için binanın temeli ne kadar önemliyse, bir yazılım mühendisi için de kodun mimarisi o kadar önemlidir. Özellikle PHP gibi esnek dillerde, proje büyüdükçe kodun yönetilemez bir "makarna" (spagetti kod) haline gelmesi işten bile değildir. Bu yazıda, modern PHP mühendisliğinin temel taşlarından biri olan Dependency Injection (Bağımlılık Enjeksiyonu) kavramını ve bunun neden kritik olduğunu inceleyeceğiz.
Sorun: Sıkı Bağlı (Tightly Coupled) Yapılar
Geleneksel PHP geliştirmelerinde sıkça yapılan hata, sınıfların ihtiyaç duydukları diğer sınıfları kendi içlerinde oluşturmalarıdır.
// Hatalı Yaklaşım: Mühendislik açısından sürdürülemez
class OrderService {
protected $logger;
public function __construct() {
// Hata burada: DatabaseLogger sınıfına göbekten bağlıyız!
$this->logger = new DatabaseLogger();
}
public function createOrder($order) {
$this->logger->log("Sipariş oluşturuldu.");
}
}
Bu kodun mühendislik açısından kusuru şudur: Eğer yarın logları veritabanına değil de bir dosyaya (FileLogger) yazmak istersek, OrderService sınıfının kaynak kodunu değiştirmek zorunda kalırız. Bu durum, Open/Closed (Gelişime açık, değişime kapalı) prensibine aykırıdır.
Çözüm: Dependency Injection (Bağımlılık Enjeksiyonu)
Mühendislikte amaç, parçaları modüler hale getirmektir. Bağımlılıkları sınıfın içinde üretmek yerine, dışarıdan enjekte etmeliyiz.
// Modern Mühendislik Yaklaşımı
interface LoggerInterface {
public function log(string $message);
}
class OrderService {
protected $logger;
// Bağımlılık dışarıdan (Constructor Injection) geliyor
public function __construct(LoggerInterface $logger) {
$this->logger = $logger;
}
public function createOrder($order) {
$this->logger->log("Sipariş oluşturuldu.");
}
}
Neden Bu Yöntemi Kullanmalıyız?
- Test Edilebilirlik: Birim testleri (Unit Tests) yazarken, veritabanına gerçekten bağlanmak yerine sahte (mock) bir loglayıcı servisi enjekte edebilirsiniz.
- Bakım Kolaylığı: Loglama altyapınızı değiştirmek istediğinizde
OrderServicesınıfına dokunmanıza gerek kalmaz. Sadece servisi başlatırken verdiğiniz parametreyi değiştirirsiniz. - Standartlara Uygunluk: Bu yapı, modern PHP frameworklerinin (Laravel, Symfony) çalışma mantığının temelidir.
Sonuç
PHP ile "kod yazmak" ve "mühendislik yapmak" arasındaki fark, sürdürülebilirlikte gizlidir. Dependency Injection gibi desenleri (patterns) kullanmak, projenizin sadece bugün çalışmasını değil, yıllar sonra bile geliştirilebilir kalmasını sağlar. Unutmayın, iyi bir mühendis kodun nasıl çalıştığı kadar, nasıl yaşayacağını da tasarlar.