PHP Soyut Class (Abstract Class) Kullanımı
Hepinize merhaba dostlarım 😊. Bu yazımda sizlere php programlama dilinde oop mimarisinde vazgeçilmez olan, özellikle büyük projelerde sıklıkla kullanılan, oluşturduğumuz class ın çalışma mantığını bize sunan, backend developer mülakatlarının vazgeçilmezi olan ve dediğim gibi oop mimarisinde hemen hemen her yerde sıklıkla kullanılan bir yapı olan Soyut Class (Abstract Class) kullanımından bahsedeceğim. Biraz kamaşık gelmiş olabilir ismi size ama size şunu da söylemek istiyorum: "PHP Interface Kullanımı yazıma göz atarsanız biraz sonra bu yapıp biraz daha anlayacaksınız 😊". PHP Interface Kullanımı başlıklı yazıma buradan ulaşabilirsiniz. O halde sözümüzü daha fazla uzatmadan hemen konumuza geçişimizi yapalım dostlarım 😊
Soyut Class (Abstract Class) Nedir ?
Eveeet dostlarım artık geldik yavaş yavaş konumuza girişimizi yapmaya başladık 😊. Abstract class yukarıda da bahsettiğim gibi soyut class olarak geçer ve bizim bu class üzerinden oluşturacağımızı class lara bir kontrol yani bir kural koyar 😊. Özellikle büyük projelerde (ki inşaAllah size büyük projelerde çalışmak nasip olur) genellikle oluşturulan bir oop yaklaşımıdır 😊. Mantığı ise şudur bir class oluşturduğumuzda özellikle ürünler için bir class oluşturcaz. Zorunlu tutacağımız bazı methodlar olabilir. Örnek vermemiz gerekirse özellikle e-ticaret veya erp gibi ürün bilgilerini tutacağımız yazılımlarda fatura işlemleri çok çok önem arz eder. İşte bu durumlar için dostlarım o class içerisinde zorunlu olarak tutturmak istediğimiz methodlar olabilir. İşte bunu soyut class (abstract class) ile çok rahat bir şekilde sağlayabiliriz. Şimdi Interface Kullanımı başlıklı yazımı okuyan dostlarım hemen diyeceklerdir ki seziyorum bunu ben de aynı tepkiyi vermiştim 😊
Hocam iyi güzel anlatıyorsunuz Allah razı olsun ama bizim aklımıza takılan birkaç sorumuz var. Interface ile hemen hemen aynı özellikleri gördük gibi. Burada bizim aklımıza takılan şey şu: 'İkisi arasındaki fark ne ?'
şeklinde bir soru zihninizde yer alıyor dostlarım 😊. Öğrenme adı altında bu denli güzel soruların olması cidden çok ama çok güzel 😊. Şimdi ise sizin aklınızdak soruları cevaplama niteliğinde olan bir başlığa girişimizi yapalım 😊
Soyut Class (Abstract Class) ve Interface Karşılaştırılması
Eveeeet geldik şimdi aklınızı kurcalayan sorunun cevabına 😊. Dediğiniz gibi Interface kullanımı ile hemen hemen aynı yapıdadır. Ama belirli farkları da vardır dostlarım 😊. Şimdi yavaştan yavaştan ilk önce benzerliklerine bakalım 😊
- İkisi de kullanılacağı class üzerinde zorunlu bir method kullanımı şartı sağlarlar
- Normalbir class tan nesne türetilir gibi türetilemezler
- Kuralımızı hangi erişim belirleyicisi ile oluşturmuşsak (public, private) aynı şekilde kullanırken de bu erişim belirleyicisi ile çağırmamız gerekecektir
şeklinde benzer özelliklerimizi görmüş olduk dostlarım 😊. Gelelim şimdi farklılıklarımıza göz atalım 😊
- Abstract Class oluşturduğumuzda bunu uygulayacağımız class üzerine extends edilirken Interface kullanımında implements edilir
- Abstract Class içerisine en az bir tane abstract method alması gerekir
- Abstract Class içerisine constructor ve değişken tanımlanabilir. Bu da Abstract Class ı Interface den ayıran en büyük özelliktir 😊
Eveeet dostlarım 😊. Artık yapıyı da anladığımıza göre gelelim artık abstract class ımızı oluşturmaya ve bunu kullanmaya 😊.
Soyut Class'ımızı (Abstract Class) Oluşturalım ve Kullanalım
Konuya daha giriş yapmadan heyecanınız taa buradan belli oluyor dostlarım 😊. Az sakin konumuza girişimizi yaptık fazla heyecan yapmayın 😅. Şimdi örnek olarak bir index.php dosyası oluşturalım ve daha sonrasında da aşağıdaki gibi kodlarımızı yazalım
<?php
abstract class babaClass{ // babaClass isminde bir abstract class oluşturduk
public $karsila; // İçerisine bir değişken oluşturduk (zorunlu değil isterseniz tanımlamayabilirsiniz)
public function __construct()
{
$this->karsila = "Merhaba "; // constructor ile Merhaba değerini atadık (constructor zorunlu değil isterseniz tanımlamayabilirsiniz)
}
abstract public function isim($s); // isim adlı methodu bu oluşturduğumuz abstract class tan miras alan sınıflarda zorunlu olarak kullanılmasını istedik
}
class gencClass extends babaClass { // gencClass isminde normal bir class oluşturduk ve babaClass tanımlı abstract class ından extends edilmesini söyledik
public function isim($s) // zorunlu olan methodumuzu yazdık (parametre de zorunlu bu arada :) )
{
return $this->karsila.$s; // gelen parametre ile constructor üzerinde ayarladığımız değişkeni concat et ve geri döndür dedik
}
}
$babaClass = new gencClass(); // gencCass isimli class tan bir nesne oluşturduk
echo $babaClass->isim("Ali"); // geri döndürdüğümüz değeri ekrana bas dedik
şeklinde olacakır dostlarım 😊. Kodlarımızı çalıştırdığımızda ise karşımıza
Merhaba Ali
şeklinde bir sonuç bastırılacaktır 😊. İşlemlere dikkat etmişseniz hemen hemen Interface kullanımı ile aynı lakin abstract class üzerinde gördüğümüz üzere değişken tanımlama, constructor oluşturma işlemleri falan var 😊. Şimdi gelelim kodlarımızda bir oynama yapalım. oluşturduğumuz gencClass içerisine gelip
<?php
abstract class babaClass{
public $karsila;
public function __construct()
{
$this->karsila = "Merhaba ";
}
abstract public function isim($s); // burada public olarak şart koyduk
}
class gencClass extends babaClass {
protected function isim($s) // burada public olarak koyduğumuz şartı protected olarak çağırmayı denedik
{
return $this->karsila.$s;
}
}
$babaClass = new gencClass();
echo $babaClass->isim("Ali");
şeklinde kodlarımızı değiştirelim dostlarım. Bunu yazar yazmaz özellikle PHPStorm gibi Editör kullanıyorsanız size altını çizecektir yani "Dostum bir şeyleri yanlış yapıyorsun farkında mısın ?" şeklinde uyarı veriliyor. Bunu da size gelin göstereyim
şeklinde kodlarımızın altını çizmiş bulunmakta dostlarım 😊. Biz bu hatayı göz ardı edip çalıştırdığımızda ise karşımıza
Fatal error: Access level to gencClass::isim() must be public (as in class babaClass) in D:\xampp\htdocs\abstract\index.php on line 17
şeklinde uyarı gelecektir 😊. Burada da program bize diyor ki: "Kardeşim senin gencClass isimli class ının içerisinde oluşturduğun method public olmalı. Kural olarak yazdığın babaClass içerisinde öyle geçiyor 😉" şeklinde uyarı veriyor. Yukarıda bahsettiğim yani Interface ile benzerliği yönlerinden birisi bu 😊.
Gelin sizinle birlikte hem sizin pratiklik kazanmanız için hem de benim delisi olduğum bilgisayarlar üzerinden yola çıkarak bir abstract class işlemi ayarlayalım 😊. Hemen kod kısmımızı açalım ve
abstract class PC{
public $message;
public function __construct()
{
$this->message="Seçtiğiniz Bilgisayar: ";
}
abstract public function info($brand,$model);
}
class Casper extends PC{
public function info($brand, $model)
{
$this->message.=" Casper ";
return $this->message.$brand." ".$model;
}
}
class Monster extends PC{
public function info($brand, $model)
{
$this->message.=" Monster ";
return $this->message.$brand." ".$model;
}
}
class Apple extends PC{
public function info($brand, $model)
{
$this->message.=" Apple ";
return $this->message.$brand." ".$model;
}
}
$casper = new Casper();
$monster = new Monster();
$apple = new Apple();
echo $casper->info("Excalibur","G670")."<br>";
echo $monster->info("Tulpar","T7 v21.1.3")."<br>";
echo $apple->info("Macbook","Pro 2021");
şeklinde kodlarımızı yazdol dostlarım 😊. Kodlarımızı çalıştırdığımızda ise karşımızda
Seçtiğiniz Bilgisayar: Casper Excalibur G670
Seçtiğiniz Bilgisayar: Monster Tulpar T7 v21.1.3
Seçtiğiniz Bilgisayar: Apple Macbook Pro 2021
şeklinde çıktımız basılıyor 😊. İşlemlerimiz bu kadar basit dostlarım ve kodlarımız sağlıklı şekilde çalışıyor 💯😊
Eveeeet dostlarım 😊. Bu yazımda sizlere PHP Programlama dilinde Soyut Class (Abstract Class) Nedir ?, Hangi Durumlarda Kullanılır ?, Interface ile arasındaki benzerlikleri ve farklılıkları nelerdir bunlardan dilim döndüğünce bahsettim. Umarım faydalı olmuşumdur. Eksik veya hatalı bilgi aktarımı yapmış isem benimle iletişime geçmekten çekinmeyin 😊. Konu başlarda biraz karmaşık veya zor gelebilir dostlarım anlıyorum ben de aynı süreçlerden geçtim. Bu aşamada sizlerden yapmanızı istediğim tek şey "İstikrarlı ve Azimli Olmanız, Bolca Pratik Yapmanız 😊". Bu dediklerimi hayat felsefeniz yaptığınız sürece başarı sizler için kaçınılmaz olacaktır 😊
Hayallerinizi gerçekleştirmeniz ve güzel yerlere gelmeniz dileklerimle... İyi çalışmalar dilerim 😊
Yazar Hakkında
Kendi Halinde Bir Backend Developer