Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
PHP’de abstract class, tek başına örneği oluşturulamayan ve alt sınıflara ortak özellik veya davranış aktarmak için kullanılan sınıftır. Abstract sınıf, hem normal metot ve özellikler içerebilir hem de alt sınıfların mutlaka uygulaması gereken abstract metotlar tanımlayabilir. Bu yapı, ortak kodu merkezileştirirken alt sınıflara belirli bir sözleşme uygular.

Nasıl çalışır?​


Bir sınıfın başına abstract yazıldığında doğrudan new ile örneklenemez. Abstract metot ise yalnızca bildirimi içerir; metot gövdesi bulunmaz. Bu metodu tanımlayan her somut alt sınıf, PHP kalıtım kurallarına uyumlu metot imzasını kullanarak kendi uygulamasını yazmalıdır.

Abstract sınıfın içinde normal metotlar da bulunabilir. Alt sınıf bu metotları doğrudan kullanabilir veya gerekirse geçersiz kılabilir. Abstract sınıf başka bir abstract sınıftan türetilebilir; ancak somut olarak kullanılacak en alt sınıf, miras aldığı ve henüz uygulanmamış tüm abstract metotları tamamlamalıdır.

Çalıştırılabilir tam örnek​


Aşağıdaki PHP CLI örneği bildirim metnini yalnız ekrana yazar; gerçek e-posta veya SMS göndermez. dosya.php adıyla kaydedip uygun PHP ortamında php dosya.php ile çalıştırılabilir:

PHP:
<?php

abstract class Notification
{
    public function send(string $message): void
    {
        echo $this->format($message) . PHP_EOL;
    }

    abstract protected function format(string $message): string;
}

final class EmailNotification extends Notification
{
    protected function format(string $message): string
    {
        return 'E-posta: ' . $message;
    }
}

final class SmsNotification extends Notification
{
    protected function format(string $message): string
    {
        return 'SMS: ' . $message;
    }
}

$email = new EmailNotification();
$email->send('Hesabınız hazır.');

$sms = new SmsNotification();
$sms->send('Doğrulama kodunuz gönderildi.');

Bu kod bir PHP dosyasında çalıştırıldığında beklenen çıktı şuna benzer:

Kod:
E-posta: Hesabınız hazır.
SMS: Doğrulama kodunuz gönderildi.

Burada Notification sınıfından nesne üretilemez; çünkü sınıf abstract olarak tanımlanmıştır. Buna karşılık EmailNotification ve SmsNotification somut sınıflardır. Ortak send() akışı üst sınıfta tutulur, kanalın kendine özgü biçimlendirmesi ise format() içinde alt sınıfa bırakılır.

Abstract metodun kapsamı da alt sınıfta uyumlu olmalıdır. Örneğin üst sınıf metodu protected ise alt sınıf onu daha dar bir görünürlükle private yapamaz. Parametreler, dönüş tipi ve gerekli uyumluluk kuralları da korunmalıdır.

Abstract class mı, interface mi?​


Karar verirken temel ayrım şudur: Abstract sınıf, ortak uygulama kodu ve ortak durum taşımak için uygundur. Interface ise sınıfların hangi metotları sunacağını belirtir; genellikle ortak iş akışını paylaşmak yerine bir yetenek veya sözleşme tanımlar. PHP’de bir sınıf yalnızca bir sınıftan kalıtım alabilir, ancak birden fazla interface uygulayabilir.

İhtiyaçUygun tercihNedeni
Ortak metot gövdesi ve ortak özelliklerAbstract classHazır davranış alt sınıflara aktarılır.
Birden fazla bağımsız sınıfa aynı yeteneği zorunlu kılmakInterfaceSınıflar farklı hiyerarşilerden gelirken aynı sözleşmeyi uygulayabilir.
Yalnızca ortak yardımcı kodNormal sınıf veya ayrı servisGereksiz kalıtım bağımlılığı oluşturulmaz.

Abstract sınıfı, alt sınıflar arasında gerçekten ortak olan bir temel bulunduğunda kullanın. Sadece birkaç sınıfın aynı metodu sunmasını istiyor, fakat ortak durum veya hazır davranış paylaşmıyorsanız interface daha esnek olabilir.

Sık yapılan hatalar ve doğru kararlar​


  1. Abstract sınıftan doğrudan nesne üretmeye çalışmayın. new Notification() kullanımı hata verir; somut bir alt sınıf oluşturup onu örnekleyin.
  2. Abstract metodu alt sınıfta eksik bırakmayın. Somut sınıfın bildirimi uygulanmamış abstract metot bırakıyorsa PHP hata verir; sorun yalnız nesne üretme anına ertelenmiş değildir.
  3. Alt sınıfın metodunu daha dar görünür yapmayın. Üst sınıftaki public metot protected veya private yapılamaz.
  4. Abstract sınıfa her ortak kodu doldurmayın. Alt sınıflar arasında paylaşılmayan davranışları ayrı bir sınıfa veya servise taşımak bağımlılığı azaltır.
  5. Sadece değişken davranış için abstract sınıf seçmeyin. Birden fazla sınıf hiyerarşisinde kullanılacak bir sözleşme gerekiyorsa interface seçeneğini de değerlendirin.

Sonraki adım olarak, ortak akışı üst sınıfa; değişen ayrıntıları abstract metotlara ayırın. Alt sınıfları mümkünse üst sınıf türüyle kullanan kod yazın. Böylece çağıran kod, belirli bir alt sınıfa gereksiz yere bağlanmadan yeni uygulamalar ekleyebilir.

Sık sorulan sorular​

Abstract sınıfın constructor’ı kendiliğinden çalışır mı?​

Alt sınıf kendi constructor’ını tanımlamıyorsa uygun üst constructor’ı miras alabilir. Kendi constructor’ını tanımladığında üst başlangıç kodu otomatik çağrılmaz; gerekiyorsa parent::__construct(...) açıkça çağrılmalıdır. Ortak durumun hangi yoldan hazırlandığını test edin.

Alt metot parametre ve dönüş türünü değiştirebilir mi?​

İmzanın yazılışı her durumda birebir aynı olmak zorunda değildir; PHP’nin uyumluluk, kovaryans ve kontravaryans kuralları geçerlidir. Görünürlüğü daraltmak veya zorunlu parametreleri uyumsuz değiştirmek hata oluşturabilir. Bir örneği kopyalamak yerine kullandığınız sürümde geçerli sözleşmeyi koruyun.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.