Merhaba arkadaşlar. Bu yazımızda Php ile soyut sınıfların kullanımına değineceğiz.
Soyut sınıflar OOP yani Nesne Yönelimli Programlama yönteminde önemli bir yere sahiptir. Soyut sınıflar abstract anahtar kelimesiyle tanımlanan, içerisinde bir takım abstract metotlar kullanılan sınıflardır. Soyut sınıflar en az bir adet abstract metot yani soyut metot içermek zorundadırlar. Soyut sınıflar kalıtım konusunu kapsar. Kendisinden türetilen sınıflarda , soyut sınıf içerisinde tanımladığımız metotları kullanabiliriz. Soyut sınıf içerisinde tanımlanan özellikler ve fonksiyonlar işlem yapmazlar. Sadece parametreleri belirtilir ve fonksiyon tanımlanır.
Soyut sınıflar new anahtar kelimesi ile türetilemezler.
Temel tanımlama şekli şöyledir.
<?php
abstract class ustClass{
abstract public function ilk_metot();
abstract public function ikinci_metot($isim, $soyisim);
abstract public function ucuncu_metot() : string;
}
?>
En yaygın kullanım amacı ise şudur. Büyük projelerde projeye sonradan dahil olan kişi, eğer soyut sınıflar kullanıldıysa sadece o soyut sınıflara bakarak projenin yapısını ve çalışma mantığını anlayabilir. Böylelikle projeye daha kısa sürede adapte olabilir.
Şimdi basit bir örnek yapalım.
<?php
// Kapsayıcı sınıf
abstract class Okul {
abstract public function okul_turu($tur);
}
class Universite extends Okul{
public function okul_turu($universite)
{
return "Okul Türü: ".$universite;
}
}
class Lise extends Okul{
public function okul_turu($lise)
{
return "Okul Türü: ".$lise;
}
}
$uni = new Universite();
echo $uni->okul_turu("Üniversite");
echo "<br>";
$lise = new Universite();
echo $lise->okul_turu("Lise");
?>
Soyut sınıftan miras alan alt sınıfta, soyut sınıfta tanımlanan özellik ve metotlar aynı isimle ve aynı erişim belirleyici ile tanımlanmak zorundadır. Aksi halde program hata verecektir. Mesela soyut sınıfta protected erişim belirleyicisi ile bir metot tanımladık. Alt sınıfta da aynı isimle protected erişim belirleyicisiyle tanımlanmış olan bir metot bulunmalıdır.
<?php
// Kapsayıcı sınıf
abstract class Okul {
abstract public function okul_turu($tur);
}
class Universite extends Okul{
protected function okul_turu($universite)
{
return "Okul Türü: ".$universite;
}
}
$lise = new Universite();
echo $lise->okul_turu("Lise");
?>
Yukarıdaki kod bloğu çalıştığında ekranda aşağıdaki gibi bir hata çıkacaktır.
Fatal error: Access level to Universite::okul_turu() must be public (as in class Okul) in C:\xampp\htdocs\egitim\index.php on line 12
Hatanın nedeni şudur. Universite sınıfı okul sınıfından türetilmiştir. Okul sınıfında public erişim belirleyicisi ile tanımlanan metot Universite sınıfında protected erişim belirleyicisi ile tanımlandığı için program hata verir. Eğer public ile tanımlansaydı hata vermezdi.
Soyut sınıftan miras alan alt sınıf şu kurallara dikkat etmelidir;
- Alt sınıftaki metotlar, ana soyut sınıftaki metotlardaki aynı metot adını kullanmak zorundadır.
- Alt sınıftaki metotlar, ana soyut sınıftaki metotlarla aynı erişim belirleyicileri kullanmak zorundadır.
- Soyut sınıfta tanımlanan metottaki parametrelerin sayısı ile alt sınıfta tanımlanan metodun parametre sayısı aynı olmalıdır.
Abstract Class'ların temel amacı aynı metot ve özelliklere sahip olacak birden fazla sınıfımız varsa Abstract class ile bunları bir ana sınıfta toplayarak alt sınıflarda daha anlaşılır ve verimli kod yazmayı, kodların belli bir hiyerarşi ve düzen içerisinde olmasını sağlayabiliriz.
Şimdi bununla alakalı bir örnek daha yapalım. Insan adlı bir soyut sınıf oluşturalım ve kişileri bu soyut sınıf üzerinden tanımlayalım.
<?php
// Kapsayıcı sınıf
abstract class Insan {
public $isim;
public $yas;
abstract public function kisi_bilgileri($isim,$yas);
}
class Zafer extends Insan{
public function kisi_bilgileri($isim,$yas)
{
return "Kişi adı:".$isim." ve kişinin yaşı: ".$yas."<br>";
}
}
class Sare extends Insan{
public function kisi_bilgileri($isim,$yas)
{
return "Kişi adı:".$isim." ve kişinin yaşı: ".$yas."<br>";
}
}
class Seda extends Insan
{
public function kisi_bilgileri($isim,$yas)
{
return "Kişi adı:".$isim." ve kişinin yaşı: ".$yas."<br>";
}
}
class Sude extends Insan{
public function kisi_bilgileri($isim,$yas)
{
return "Kişi adı:".$isim." ve kişinin yaşı: ".$yas."<br>";
}
}
$zafer = new Zafer();
$sarenur = new Sare();
$seda= new Seda();
$sude = new Sude();
echo $zafer->kisi_bilgileri("Zafer Yıldız",26);
echo $sarenur->kisi_bilgileri("Sarenur Yıldız",21);
echo $seda->kisi_bilgileri("Sedanur Yıldız",21);
echo $sude->kisi_bilgileri("Sudenur Yıldız",13);
?>
Kodun Çıktısı:
Kişi adı:Zafer Yıldız ve kişinin yaşı: 26 Kişi adı:Sarenur Yıldız ve kişinin yaşı: 21 Kişi adı:Sedanur Yıldız ve kişinin yaşı: 21 Kişi adı:Sudenur Yıldız ve kişinin yaşı: 13
Аhaa, its good conversatiоn аbout this article hеre at this Ƅlog, I have read all that, so now me also commenting at this place.
This is my first time pay a visit at here and i am actually impressed to read everthing at single place.
Onur ALTUNTAŞ
30-January-2022Teşekkürler çık açıklayıcı olmuş