PHP Academy · Ders

SOLID İlkelerini Uygulamada Kullanma

Beş SOLID ilkesini gerçek PHP sınıflarına uygulayın.

1. ders / 413 adım

SOLID İlkelerini Uygulamada Kullanma, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.

SOLID Neden Kullanılır?

SOLID, nesne yönelimli PHP'yi esnek, sınanabilir ve bozulmaya dayanıklı tutan beş tasarım ilkesidir. Bunlar körlemesine uyulacak kurallar değil, bağımlılığı azaltan ve sorumlulukları netleştiren sezgisel rehberlerdir. Bu derste her ilkeyi, gerçekte yayımlayacağınız somut PHP sınıflarına uygularız.

  • S Tek Sorumluluk
  • O Açık/Kapalı
  • L Liskov'un Yerine Koyma
  • I Arayüz Ayrımı
  • D Bağımlılıkların Tersine Çevrilmesi

Tek Sorumluluk

Bir sınıfın değişmesi için tek bir nedeni olmalıdır. Rapor oluşturan, onu HTML olarak biçimlendiren ve e-postayla gönderen bir sınıfın değişmesi için üç nedeni vardır. Veri kalıcılığını, biçimlendirmeyi ve aktarımı ayırın.

Aşağıda Invoice yalnızca veriyi modeller; oluşturma ve kaydetme başka yerde bulunur.

<?php
final class Invoice {
    public function __construct(
        public readonly string $number,
        public readonly int $cents
    ) {}
    public function total(): float { return $this->cents / 100; }
}

final class InvoiceRenderer {
    public function toText(Invoice $i): string {
        return sprintf('Invoice %s: $%.2f', $i->number, $i->total());
    }
}

$i = new Invoice('INV-1', 12500);
echo (new InvoiceRenderer())->toText($i), PHP_EOL;

SRP: Kötü Kokuyu Saptama

Klasik SRP ihlali, adında ve sözcüğü bulunan bir sınıf veya her şeyi yapan bir Manager sınıfıdır. İlişkisiz iş gerekçeleri nedeniyle değişen yöntemlere dikkat edin. Bir vergi kuralı değişikliğiyle PDF yerleşimi değişikliği aynı sınıfa dokunuyorsa bu sınıfın çok fazla sorumluluğu vardır.

Açık/Kapalı İlkesi

Yazılım varlıkları genişletmeye açık, değişikliğe kapalı olmalıdır. Yeni bir indirim türü eklemek, dev bir switch üzerinde düzenleme yapmayı gerektirmemelidir. Çok biçimliliği kullanın: her kural, ortak bir arayüzü uygulayan kendi sınıfı olsun.

<?php
interface Discount { public function apply(float $total): float; }

final class PercentOff implements Discount {
    public function __construct(private float $pct) {}
    public function apply(float $t): float { return $t * (1 - $this->pct / 100); }
}
final class FlatOff implements Discount {
    public function __construct(private float $amount) {}
    public function apply(float $t): float { return max(0, $t - $this->amount); }
}

function checkout(float $total, Discount ...$discounts): float {
    foreach ($discounts as $d) { $total = $d->apply($total); }
    return $total;
}
echo checkout(100, new PercentOff(10), new FlatOff(5)), PHP_EOL; // 85

Liskov'un Yerine Koyma İlkesi

Alt türler, temel türlerinin beklendiği her yerde çağıranı şaşırtmadan kullanılabilmelidir. Ünlü örnek şudur: Square extends Rectangle LSP'yi bozar, çünkü genişliğin ayarlanması yüksekliği sessizce değiştirmemelidir. Bunları ortak bir Shape arayüzünün arkasında ayrı türler olarak modellemeyi tercih edin.

<?php
interface Shape { public function area(): float; }

final class Rectangle implements Shape {
    public function __construct(private float $w, private float $h) {}
    public function area(): float { return $this->w * $this->h; }
}
final class Square implements Shape {
    public function __construct(private float $side) {}
    public function area(): float { return $this->side ** 2; }
}

$shapes = [new Rectangle(2, 3), new Square(4)];
foreach ($shapes as $s) { echo $s->area(), PHP_EOL; }

LSP ve Sözleşmeler

LSP, yöntem sözleşmelerini de sınırlar. Bir alt tür ön koşulları gevşetebilir ve son koşulları güçlendirebilir; bunun tersi asla geçerli değildir. Temel türün hiç bildirmediği yeni bir istisna türü fırlatmak veya temel tür bir nesne garanti ederken null döndürmek, yerine koyulabilirliği ihlal eder. PHP'nin kovaryant dönüş türleri ve kontravaryant parametre türleri bunun bir bölümünü tür düzeyinde zorunlu kılar.

Arayüz Ayrımı

İstemciler kullanmadıkları yöntemlere bağımlı olmamalıdır. work() ve eat() yöntemlerine sahip şişkin bir Worker arayüzü, RobotWorker sınıfını eat() için boş bir gövde yazmaya zorlar. Odaklanmış rol arayüzlerine ayırın; böylece her uygulayan sınıf yalnızca gerçekten yaptığı işleri taahhüt eder.

<?php
interface Workable { public function work(): string; }
interface Feedable { public function eat(): string; }

final class Human implements Workable, Feedable {
    public function work(): string { return 'coding'; }
    public function eat(): string { return 'lunch'; }
}
final class Robot implements Workable {
    public function work(): string { return 'welding'; }
}

foreach ([new Human(), new Robot()] as $w) { echo $w->work(), PHP_EOL; }

Bağımlılıkların Tersine Çevrilmesi

Üst düzey politika, somut ayrıntılara değil soyutlamalara dayanmalıdır. Sabit kodlanmış bir sınıf yerine bir arayüz enjekte edin. Böylece gerçek bir posta göndericisini sınamalarda sahte bir göndericiyle, üretimde ise başka bir sağlayıcıyla, tüketiciye dokunmadan değiştirebilirsiniz.

<?php
interface Mailer { public function send(string $to, string $body): void; }

final class SmtpMailer implements Mailer {
    public function send(string $to, string $body): void {
        echo "SMTP -> $to: $body" . PHP_EOL;
    }
}

final class SignupService {
    public function __construct(private Mailer $mailer) {}
    public function register(string $email): void {
        $this->mailer->send($email, 'Welcome!');
    }
}

(new SignupService(new SmtpMailer()))->register('a@b.com');

DIP ve Kapsayıcı

Bağımlılık Tersine Çevirme ilkedir; bağımlılık Enjeksiyonu ise bu ilkeyi karşılamak için kullanılan tekniklerden biridir. Bir DI kapsayıcısı (PSR-11), somut SmtpMailer sınıfını birleştirme kökünde Mailer soyutlamasına bağlar. Tüketici hiçbir zaman new SmtpMailer() demez; böylece kaynak kodu bağımlılığının yönü ayrıntıya değil soyutlamaya doğrudur.

<?php
// Composition root wiring (pseudo-container)
$bindings = [
    Mailer::class => fn() => new SmtpMailer(),
];
$resolve = fn(string $id) => $bindings[$id]();

$service = new SignupService($resolve(Mailer::class));
$service->register('user@example.com');

SOLID'in Birlikte Kullanımı

İlkeler birbirini güçlendirir. ISP, DIP enjeksiyonlarının odaklı kalması için arayüzleri küçük tutar; OCP, LSP'nin güvenli tuttuğu çok biçimliliğe dayanır; SRP, tüm bunları mümkün kılan küçük sınıfları sağlar. İçeride güçlü bütünlük, aralarında gevşek bağımlılık hedefleyin.

  • Tek kullanımlık bir sınıfı gereğinden fazla soyutlamayın.
  • İkinci bir uygulama veya sahte bir sınama nesnesi ortaya çıktığında bir arayüz ekleyin.

Pragmatizm

SOLID bir araçtır, amaç değil. Tek uygulaması olan erken bir arayüz, karşılık sağlamayan bir dolaylılık ekler (“varsayımsal genellik”). İlkeleri, değişiklik gerçekten geldiğinde veya açıkça yaklaştığında uygulayın. Sınamalarınız olduğunda SOLID'e doğru yeniden düzenleme yapmak ucuzdur; ilk günden körlemesine bu yönde yeniden düzenleme yapmak ise israftır.

Hızlı Kontrol

Square/Rectangle kalıtım sorunu hangi ilkeyi ihlal eder?

Tekrar

Beş SOLID ilkesinin tümünü gerçek PHP'ye uyguladınız:

  • SRP: sınıf başına tek değişme nedeni.
  • OCP: switch'i düzenlemek yerine yeni çok biçimli sınıflarla genişletme.
  • LSP: alt türler temel sözleşmeye uyar.
  • ISP: şişkin arayüzler yerine küçük rol arayüzleri.
  • DIP: soyutlamalara bağımlı olun, ayrıntıları birleştirme kökünde enjekte edin.

Onları bir formalite olarak değil, yeniden düzenlemeye yön vermek için kullanın.

Başlamak ücretsiz

Yapay zeka eğitmeniyle PHP öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
49
Dersler
195

Sıkça Sorulan Sorular

“SOLID İlkelerini Uygulamada Kullanma” dersi ücretsiz mi?

Evet — “SOLID İlkelerini Uygulamada Kullanma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.

“SOLID İlkelerini Uygulamada Kullanma” dersinde ne öğreneceğim?

Beş SOLID ilkesini gerçek PHP sınıflarına uygulayın. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

PHP Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“SOLID İlkelerini Uygulamada Kullanma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. SOLID İlkelerini Uygulamada Kullanma
  2. Oluşturucu Örüntüler: Factory, Builder, Singleton
  3. Yapısal Örüntüler: Adapter, Decorator, Facade
  4. Davranışsal Örüntüler: Strategy, Observer, Command
← PHP Academy Sayfasına Dön