ana_sayfa / php / oop-nesne-y-nelimli-programlama
🐘 PHP 📊 İleri ⏱ 30 dk 📋 1 Kod Örneği

OOP — Nesne Yönelimli Programlama

Sınıf, nesne, kalıtım, arayüz, soyut sınıflar ve özellik kullanımı.

Nesne yönelimli programlama (OOP) kodu organize eden, tekrar kullanılabilir ve bakımı kolay yapılar oluşturmayı sağlar. Laravel, Symfony gibi tüm modern PHP frameworkleri OOP üzerine kuruludur.

Encapsulation — Kapsülleme

Sınıfın iç verilerini gizleme pratiğidir. private özellikler sadece sınıf içinden, protected alt sınıflardan, public her yerden erişilebilir.

Interface vs Abstract Sınıf

Interface sadece metot imzaları tanımlar, hiç kod içermez. Abstract sınıf hem soyut hem somut metotlar içerebilir. Bir sınıf birden fazla interface implement edebilir, ama sadece bir sınıftan extend edilebilir.

PHP OOP Tam Örnek
<?php
// ── Interface ──
interface OdemeYapilabilir {
    public function odemeYap(float $tutar): bool;
    public function odemeDogrula(): bool;
}

// ── Abstract Sınıf ──
abstract class Kullanici {
    protected string $ad;
    protected string $email;
    private static int $sayac = 0;

    public function __construct(string $ad, string $email) {
        $this->ad    = $ad;
        $this->email = $email;
        self::$sayac++;
    }

    // Getter
    public function getAd(): string { return $this->ad; }
    public function getEmail(): string { return $this->email; }

    // Setter
    public function setEmail(string $email): void {
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new InvalidArgumentException("Geçersiz e-posta!");
        }
        $this->email = $email;
    }

    // Static metot
    public static function getSayac(): int { return self::$sayac; }

    // Soyut metot — alt sınıf zorunlu implement eder
    abstract public function bilgileriGoster(): string;

    // Magic metotlar
    public function __toString(): string { return $this->bilgileriGoster(); }
    public function __destruct() { /* Nesne yok edilince çalışır */ }
}

// ── Kalıtım ──
class UyeKullanici extends Kullanici implements OdemeYapilabilir {
    private string $uyelik_tipi;
    private array  $siparisler = [];

    public function __construct(string $ad, string $email, string $tip = "ucretsiz") {
        parent::__construct($ad, $email); // Üst sınıf constructor'ı çağır
        $this->uyelik_tipi = $tip;
    }

    public function bilgileriGoster(): string {
        return "{$this->ad} ({$this->email}) — {$this->uyelik_tipi} üye";
    }

    public function odemeYap(float $tutar): bool {
        echo "{$this->ad} için {$tutar}₺ ödeme alındı.\n";
        return true;
    }

    public function odemeDogrula(): bool {
        return $this->uyelik_tipi === "premium";
    }

    public function siparisvErkle(string $urun): void {
        $this->siparisler[] = $urun;
    }

    public function getSiparisler(): array { return $this->siparisler; }
}

// ── Trait ──
trait Loglanabilir {
    private array $loglar = [];

    public function log(string $mesaj): void {
        $this->loglar[] = date("H:i:s") . " — " . $mesaj;
    }

    public function getLoglari(): array { return $this->loglar; }
}

class AdminKullanici extends Kullanici {
    use Loglanabilir; // Trait ekle

    private array $yetkiler;

    public function __construct(string $ad, string $email, array $yetkiler = []) {
        parent::__construct($ad, $email);
        $this->yetkiler = $yetkiler;
        $this->log("Admin oluşturuldu: $ad");
    }

    public function bilgileriGoster(): string {
        return "{$this->ad} — Admin (" . implode(", ", $this->yetkiler) . ")";
    }

    public function yetkiVarMi(string $yetki): bool {
        return in_array($yetki, $this->yetkiler);
    }
}

// ── Kullanım ──
$uye  = new UyeKullanici("Furkan", "furkan@mail.com", "premium");
$admin = new AdminKullanici("Ahmet", "ahmet@mail.com", ["yonet", "sil", "duzenle"]);

echo $uye->bilgileriGoster() . "\n";
echo $admin->bilgileriGoster() . "\n";

$uye->odemeYap(299);
$uye->siparisvErkle("PHP Kursu");

echo "Toplam kullanıcı: " . Kullanici::getSayac() . "\n";

// Type checking
if ($uye instanceof OdemeYapilabilir) {
    echo "Ödeme yapılabilir üye\n";
}

// Loglama
$admin->log("Yeni ders eklendi");
print_r($admin->getLoglari());
?>
← Önceki Ders
Fonksiyonlar ve Kapsam
Sonraki Ders →
PDO ile Veritabanı İşlemleri