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.
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 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
// ── 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());
?>