Soyut Sınıflar
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 25 / 91.
Soyut bir sınıf (abstract class), doğrudan örneği oluşturulamayan bir sınıftır. Diğer sınıflar için bir taslak görevi görür ve alt sınıfların uygulaması gereken yöntemleri tanımlar. Bir soyut sınıfı abstract anahtar kelimesini kullanarak oluşturursunuz.
<?php
abstract class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
}
abstract public function calculateArea();
public function getColor() {
return $this->color;
}
}
class Rectangle extends Shape {
private $width;
private $height;
public function __construct($color, $width, $height) {
parent::__construct($color);
$this->width = $width;
$this->height = $height;
}
public function calculateArea() {
return $this->width * $this->height;
}
}
$rect = new Rectangle("blue", 5, 3);
echo $rect->calculateArea();
Çıktı:
15Shape sınıfı, bir uygulama sağlamadan soyut bir calculateArea() yöntemi bildirir. Shape sınıfını genişleten herhangi bir sınıf bu yöntemi uygulamalıdır. Soyut sınıfların, alt sınıfların doğrudan miras aldığı getColor() gibi normal yöntemler de içerebileceğine dikkat edin.
Soyut metotlar, bir alt sınıfın ne yapması gerektiğini tanımlar, ancak nasıl yapacağını tanımlamaz. Bu, her şeklin alanını farklı şekilde hesaplamasına izin verirken tüm şekillerin bir calculateArea() metoduna sahip olmasını sağlar.
Önemli Nokta: Soyut sınıflar (Abstract classes), kalıtım yapısını zorunlu gereksinimlerle birleştirir. İlgili sınıflar arasında kod paylaşmak ve aynı zamanda belirli metotların her bir alt sınıf tarafından uygulanmasını sağlamak istediğinizde bunları kullanın.
Görev
KolaySoyut sınıfların bir sözleşmeyi nasıl zorunlu kıldığını ve farklı medya türlerinin kendi oynatma davranışlarını uygulamalarına nasıl izin verdiğini gösteren bir medya oynatıcı sistemi oluşturalım.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Media.php— Tüm medya türleri için taslak görevi gören soyut birMediasınıfı tanımlayın. Korumalı (protected) bir$titleözelliğine ve başlığı kabul edip ayarlayan bir yapıcıya (constructor) sahip olmalıdır. Alt sınıfların uygulaması gerekenplay()adında soyut bir metot ekleyin. Ayrıca başlığı döndüren normal birgetTitle()metodu ekleyin — bu somut metot tüm alt sınıflar tarafından miras alınacaktır.Song.php—Mediasınıfını genişleten birSongsınıfı tanımlayın. Media dosyasını en üste dahil edin. Bu sınıf bir$artistözelliği ekler. Yapıcı, başlık ve sanatçıyı kabul etmelidir — başlık içinparent::__construct()kullanın, ardından sanatçıyı kendiniz ayarlayın. Gerekliplay()metodunu"Playing song: [title] by [artist]"döndürecek şekilde uygulayın.Podcast.php—Mediasınıfını genişleten birPodcastsınıfı tanımlayın. Media dosyasını en üste dahil edin. Bu sınıf bir$episodeözelliği (bir tam sayı) ekler. Yapıcı, başlık ve bölüm numarasını kabul etmelidir — başlık içinparent::__construct()kullanın, ardından bölümü ayarlayın. Gerekliplay()metodunu"Playing podcast: [title] - Episode [episode]"döndürecek şekilde uygulayın.
main.php dosyasında hem Song hem de Podcast dosyalarını dahil edin. Dört girdi alacaksınız: şarkı başlığı, sanatçı adı, podcast başlığı ve bölüm numarası (tam sayıya dönüştürülecek bir dize olarak). Bu değerlerle bir Song ve bir Podcast nesnesi oluşturun. Önce şarkı üzerinde, ardından podcast üzerinde play() metodunu çağırmanın sonucunu, her biri kendi satırında olacak şekilde yazdırın.
Bu meydan okuma, soyut sınıfların bir sözleşmeyi nasıl tanımladığını gösterir — her medya türünün bir play() metodu olmalıdır, ancak her tür bunu farklı şekilde uygular. Soyut Media sınıfı doğrudan örneklenemez; yalnızca alt sınıflarına yapı ve paylaşılan işlevsellik sağlamak için vardır.
Kopya kağıdı
Soyut (abstract) bir sınıf, doğrudan örneği oluşturulamayan bir sınıftır. Diğer sınıflar için bir taslak görevi görür ve alt sınıfların uygulaması gereken yöntemleri tanımlar. Soyut bir sınıf oluşturmak için abstract anahtar kelimesini kullanın.
abstract class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
}
abstract public function calculateArea();
public function getColor() {
return $this->color;
}
}Alt sınıflar tüm soyut yöntemleri uygulamalıdır:
class Rectangle extends Shape {
private $width;
private $height;
public function __construct($color, $width, $height) {
parent::__construct($color);
$this->width = $width;
$this->height = $height;
}
public function calculateArea() {
return $this->width * $this->height;
}
}Temel özellikler:
- Soyut sınıfların doğrudan örneği oluşturulamaz
- Soyut yöntemlerin soyut sınıf içinde bir uygulaması yoktur
- Alt sınıflar tüm soyut yöntemleri uygulamalıdır
- Soyut sınıflar hem soyut hem de normal yöntemler içerebilir
- Soyut sınıflardaki normal yöntemler alt sınıflar tarafından miras alınır
Kendin dene
<?php
require_once 'Song.php';
require_once 'Podcast.php';
// Girdileri oku
$songTitle = trim(fgets(STDIN));
$artistName = trim(fgets(STDIN));
$podcastTitle = trim(fgets(STDIN));
$episodeNumber = intval(trim(fgets(STDIN)));
// YAPILACAK: songTitle ve artistName ile bir Song nesnesi oluşturun
// YAPILACAK: podcastTitle ve episodeNumber ile bir Podcast nesnesi oluşturun
// YAPILACAK: Şarkı üzerinde play() çağırma sonucunu yazdırın
// YAPILACAK: Podcast üzerinde play() çağırma sonucunu yazdırın
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi