PHP, nesne yönelimli programlama (OOP) prensiplerini destekleyen bir dil olarak öne çıkar. Abstract class (soyut sınıf) ve interface (arayüz), OOP'nin önemli yapıtaşlarından ikisidir. Bu yazıda, PHP'de abstract class ve interface arasındaki farkları ele alacağım. Soyutlama kavramını, farklı kullanım senaryolarını ve her birinin nasıl kullanıldığını anlatmaya çalışacağım.
Abstract class, somutlaştırılamayan ve doğrudan kullanılamayan sınıflardır. Bu sınıflar, diğer sınıflar tarafından genişletilebilir ve somutlaştırılabilirler. Abstract class, ortak özelliklere ve metotlara sahip alt sınıflar için bir şablondur. Abstract class'lar, soyut metotlar (method) içerebilir, ancak içerisindeki metotlara gövde (implementation) sahip olabilirler.
Interface, bir sınıfın belirli metotları uygulamasını ve davranışları tanımlamasını sağlayan bir yapıdır. Interface'ler, sınıflar arasında bir sözleşme (contract) sağlar. Sadece metot bildirimlerini içerir ve herhangi bir metoda sahip olamaz. Bir sınıf, birden fazla interface'i uygulayabilir. Interface'ler, çoklu mirasın eksikliği durumunda kullanılır ve bir sınıfın belirli davranışları yerine getirmesini sağlar.
Şimdi buraya kadar olanları örnekle pekiştirmeye çalışalım.
Aşağıdaki örnekte, Animal abstract class'ı, ortak özelliklere ve bir soyut metoda (makeSound()) sahip bir sınıftır. Dog sınıfı, Animal class'ını genişleterek ve makeSound() metodunu uygulayarak özelleştirilir. CanFly ve CanSwim interface'leri, farklı davranışları tanımlar. Bird sınıfı, CanFly interface'ini uygular ve fly() metodunu uygular. Duck sınıfı ise hem CanFly hem de CanSwim interface'lerini uygular ve her iki metodu da uygular.
abstract class Animal {
protected $name;
public function __construct($name) {
$this->name = $name;
}
abstract public function makeSound();
public function eat() {
echo $this->name . " yer.";
}
}
class Dog extends Animal {
public function makeSound() {
echo $this->name . " havlar.";
}
}
interface CanFly {
public function fly();
}
interface CanSwim {
public function swim();
}
class Bird implements CanFly {
public function fly() {
echo "Kuş uçar.";
}
}
class Duck implements CanFly, CanSwim {
public function fly() {
echo "Ördek uçar.";
}
public function swim() {
echo "Ördek yüzer.";
}
}
$dog = new Dog("Rex");
$dog->makeSound(); // Rex havlar.
$dog->eat(); // Rex yer.
$bird = new Bird();
$bird->fly(); // Kuş uçar.
$duck = new Duck();
$duck->fly(); // Ördek uçar.
$duck->swim(); // Ördek yüzer.
Sonuç olarak PHP'de abstract class ve interface, farklı kodlama ihtiyaçlarına ve senaryolara yönelik farklı araçlardır. Abstract class'lar, ortak özelliklere ve davranışlara sahip sınıflar için bir şablondur ve somutlaştırılabilirler. Interface'ler ise sınıflar arasında sözleşmeler ve davranış tanımları sağlarlar. Bir sınıf yalnızca bir tane abstract class'ı genişletebilirken birden fazla interface'i uygulayabilir. Abstract class'lar, metotlara gövde (implementation) sağlayabilirken interface'ler sadece metot bildirimlerini içerirler. Doğru şekilde kullanıldığında, abstract class ve interface, kodun daha modüler, esnek ve yeniden kullanılabilir olmasını sağlar.