Inversion of Control (IoC) ve Dependency Injection (DI) patternlerinin amacı kodunuzdan bağımlılıkları ortadan kaldırmaktır. Bu yönden benzer oldukları söylenebilir ancak Dependency Injection Inversion of Control'a ulaşmak için gereken parçalardan biridir. IOC'u anlamak için DI hakkında biraz bilgi sahibi olmamız gerekir.

Dependency Injection ( Bağımlılık Enjeksiyonu)

Bir örnek üzerinden gitmek gerekirse; Elimizde fatura sınıfı ile birlikte veritabanı ve kullanıcı sınıfımız olsun ve fatura sınıfımız diğer sınıflara bağımlı olsun.

class DB
{

    public function getItems()
    {
        return 'items';
    }
}
class User
{
    public function name()
    {
        return 'name';
    }
}

class Invoice
{
    private $user;
    private $db;

    public function __construct(User $user, DB $db)
    {
        $this->user = $user;
        $this->db = $db;
    }
}

Dikkat ederseniz Invoice sınıfımızın constructor'una DB ve User sınıfımızı enjekte ediyoruz. Böylece sınıfımız User ve DB sınıflarına sıkı sıkıya bağımlı olmayacaktır ve basitçe bağımlılık problemimizi çözmüş olacağız.

$invoice = new Invoice(new User, new DB);

Bizim için bağımlılıkları çözümleyen paketler bulunmaktadır bunlar genel olarak php reflection apisi yardımıyla bağımlılıkları otomatik olarak çözümleyebilmektedirler. Örneğin her bağımlılıkları kendimiz oluşturmak zorunda kalsaydık bir çok projemizde aşağıdakine benzer bir yapı oluşması oldukça olasıdır.

$foo = new Foo(new Bar, new Baz(new Qux(new Norf)));

IOC Container

Yine bir örnek ile başlarsak;

IoC::register('invoice', function() {
    $user = new User();
    $db = new DB();
    $invoice = new Invoice($user, $db);
    return $invoice;
});

Peki çözümlemek istersek;

$invoice = IoC::resolve('invoice');

Gördüğünüz gibi DI ve IOC oldukça benzer görünmekte ancak iki terimi şu şekilde düşünebiliriz; DI farklı enjeksiyon yöntemleri kullanarak derleme zamanında nesnenin bağımlılıklarını sağlayan somut bir yapıdır. IOC ise sınıfları yaratmaz ancak sınıfların nasıl yaratılacağı ve kullanılacağı hakkında açıklayacı bir yapı oluşturur ve böylece IoC ile bağımlılıklar, derleme zamanı yerine çalışma zamanında ilgili nesnelere eklenecektir.

Devam edecek.