PHP'de Nesne Yönelimli Programlama (OOP) Temelleri Nelerdir?

Giriş
Günümüz web uygulamaları, sürdürülebilirlik, test edilebilirlik ve yeniden kullanılabilirlik beklentileriyle birlikte karmaşıklaşıyor. PHP'de Nesne Yönelimli Programlama (OOP) bu ihtiyaçlara yanıt veren en temel yaklaşımlardan biridir. Bu rehberde OOP'nin temel kavramlarını, PHP'ye özgü uygulamalarını ve pratikte nasıl kullanılacağını örneklerle açıklayacağım.

Neden OOP?

OOP, yazılımı veri ve davranış etrafında organize ederek modülerlik ve sorumluluk ayrımı sağlar. Modern PHP çerçeveleri ve uygulamaları neredeyse tamamen sınıf-temelli bir mimari kullanır; bu da OOP bilgisini her PHP geliştiricisinin sahip olması gereken bir yetkinlik haline getirir.

Temel Kavramlar

Sınıflar (Classes) ve Nesneler (Objects)

Sınıf: Bir nesnenin özelliklerini ve davranışlarını tanımlayan şablondur. Nesne ise bu şablonun çalışma zamanındaki örneğidir.

<?php
class Kullanici {
    public $isim;

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

    public function selamla() {
        return 'Merhaba, ' . $this->isim;
    }
}

$u = new Kullanici('Ayşe');
echo $u->selamla();

Özellikler (Properties) ve Metodlar (Methods)

  • Properties: Sınıfın veri alanlarıdır (ör. $isim).
  • Methods: Sınıf davranışlarını tanımlayan fonksiyonlardır (ör. selamla()).

Görünürlük (Visibility)

PHP'de erişim belirleyicileri sayesinde sınıf üyelerinin erişimi kontrol edilir:

  • public: Her yerden erişilebilir.
  • protected: Sadece sınıf ve alt sınıflardan erişilebilir.
  • private: Sadece tanımlı olduğu sınıf içinde erişilebilir.

Yapıcı/Yıkıcı (Constructor / Destructor)

__construct() bir nesne oluşturulurken çağrılır; __destruct() nesne yok edilirken çalışır. Kaynak yönetimi veya başlangıç işlemleri için kullanılırlar.

Statik Üyeler (static)

Kullanım başına nesne oluşturmadan sınıfa ait veri ve metodlara erişim sağlar. Genelde yardımcı fonksiyonlar veya global yapılandırmalar için tercih edilir.

Kalıtım, Arayüzler ve Traitler

Kalıtım (Inheritance)

Kalıtım, bir sınıfın başka bir sınıftan özellik ve metod devralmasına olanak verir. Bu, tekrar kullanım ve hiyerarşi kurmak için kullanılır.

class Personel {
    protected $ad;

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

    public function bilgi() {
        return 'Personel: ' . $this->ad;
    }
}

class Muhasebe extends Personel {
    public function departman() {
        return 'Muhasebe';
    }
}

Arayüzler (Interfaces)

Arayüzler, sınıfların hangi metodları uygulamak zorunda olduğunu tanımlar. Çoklu kalıtım yerine sözleşme (contract) sağlar.

interface Loglanabilir {
    public function kaydet(string $mesaj);
}

class DosyaLogger implements Loglanabilir {
    public function kaydet(string $mesaj) {
        // dosyaya yazma işlemi
    }
}

Traitler

Traitler, kodun birden fazla sınıf arasında paylaşılmasını sağlar; bir nevi “mixin” gibidir. Traitler, arayüzle birlikte davranış paylaşımı için sıkça kullanılır.

trait LogTrait {
    public function log($mesaj) {
        // ortak log mekanizması
    }
}

class Servis {
    use LogTrait;
}

OOP İlkeleri: Kapsülleme, Soyutlama, Polimorfizm

  • Kapsülleme (Encapsulation): Nesnenin iç durumunu dışarıdan doğrudan değiştirmeyi engellemek; getter/setter ve görünürlüklerle sağlanır.
  • Soyutlama (Abstraction): Karmaşıklığı gizleyip gerekli arayüzleri sunmak; arayüzler ve soyut sınıflarla uygulanır.
  • Polimorfizm (Polymorphism): Aynı arayüzü paylaşan farklı nesnelerin, aynı çağrıya farklı cevaplar verebilmesi (ör. interface'leri uygulayan sınıflar).

Diğer Önemli Konular

Magic Metodlar

__get, __set, __call, __toString gibi