PHP Abstract ve Interface Üzerine: Abstract Sınıflar

Baris Eser
3 min readDec 29, 2019

OOP (Nesne Yönelimli Programlama) konusu yazılım geliştiricilerin iş görüşmelerinde en sık karşılaştıkları sorulardan olsa gerek. Maçkolik ve Sahadan uygulamalarımız için PHP developer arayışımızda gerçekleştirdiğim iş görüşmelerinde de ben de sık sık bu konu üzerinden sorular sorup tatmin edici cevaplar almak istedim. Ancak gelin görün ki yaptığım 10 iş görüşmesinden sadece 1 aday sorularıma tatmin edici cevaplar vermeyi başardı ve işe alındı 🙂

Bunun üzerine bir yazı dizisi yazmaya karar verdim. Bunlardan ilki belki de en çok karıştırılan Abstract ve Interface kavramları üzerine olmalı diye düşündüm. Zira iş görüşmelerinde adayların bu konuda kafalarının fazlasıyla karışık olduğunu anladım.

https://www.javatpoint.com/java-oops-concepts

Nedir Bu Nesne Yönelimli Programlama?

1960'lı yılların sonuna doğru ortaya çıkan bu yaklaşım, o dönemin yazılım dünyasında beliren bir bunalımın sonucudur. Yazılımların karmaşıklığı ve boyutları sürekli artıyor, ancak belli bir nitelik düzeyi korumak için gereken bakımın maliyeti zaman ve çaba olarak daha da hızlı artıyordu. NYP’yi bu soruna karşı bir çözüm haline getiren başlıca özelliği, yazılımda birimselliği (modularity) benimsemesidir. NYP ayrıca, bilgi gizleme (information hiding), veri soyutlama (data abstraction), çok biçimlilik (polymorphism) ve kalıtım (inheritance) gibi yazılımın bakımını ve aynı yazılım üzerinde birden fazla kişinin çalışmasını kolaylaştıran kavramları da yazılım literatürüne kazandırmıştır. Sağladığı bu avantajlardan dolayı, NYP günümüzde geniş çaplı yazılım projelerinde yaygın olarak kullanılmaktadır.

Abstract (Soyut) Sınıflar

Abstract sınıflar ortak özellikleri olan nesneleri modellemek için kullanılmaktadır. Telefon örneği üzerinden gidecek olursak, tüm Telefonların bir adres defteri vardır işte bu özellik soyut bir sınıfta tanımlanıp bu sınıfı extend edecek sınıflarda kullanabiliriz ve böylece kod tekrarından da kurtulmuş oluruz. Genelde OOP özelde ise Abstract ve Interface konularını daha iyi anlamak için bence güzel bir örnek bulup onun üzerinden devam etmek konuyu hem basitleştirecek hem de daha iyi anlaşılmasını sağlayacaktır. Bu yüzden telefon nesnesi üzerinden devam etmek istiyorum.

Jira üzerinden bir iş aldık. Bu işe göre Samsung telefonlar için bir sınıf oluşturmamız ve bu sınıfta Samsung telefonların özellikleri ve işlevlerini tanımlamamız istendi. Hemen işe koyulduk ve Samsung adında bir sınıf oluşturup bu telefonun karakteristik özellikleri yansıtan bir metotlar dizisi tanımladık.

İşi bitirdikten sonra bizden Samsung sınıfının benzeri bir iPhone sınıfı oluşturmamız istendi

Sınıfları incelediğimizde her ikisinin aslında 3 tane aynı metoda sahip olduğunu görüyoruz. Bunlardan sms ve addressBook metotlarının ortak olduğunu söyleyebiliriz. Neredeyse her telefonda sms gönderme ve adres defteri aynı işi gerçekleştirir. Store metodu ise iki telefonu da birbirinden ayıran önemli özelliklerden biri. Zira iPhone AppStore; Samsung ise Google play’e bağlanıp yeni uygulama indirir veya güncelleme varsa alır.

Örneğimizde artık abstract sınıf kullanmamızın zamanı geldi. Aksi halde hem Samsung hem de iPhone sınıfları aynı işi yapan ve birbirini tekrar eden sms ve addressBook metotları kalacak.

Phone adında bir abstract sınıf oluşturduk ve içinde sms ve addressBook adından iki fonksiyonumuz var. Dikkat ederseniz store fonksiyonuz ise abstract olarak deklare edilmiş. Ardından Samsung ve Iphone sınıflarımız Phone sınıfını extend ettirdik. Böylece her iki sınıf sms ve addressBook fonksiyonlarını Phone sınıfı üzerinden kullanabilecek; store fonksiyonunu ise kendi bünyelerinde tanımlamak zorunda kalacaklar.

PHP’de Abstract Özellikleri

  • PHP 5+ versiyonlarından beri tanımlıdır.
  • Soyut olarak tanımlanmış bir sınıf örneklenemeyebilir (nesnesi oluşturulamaz)
  • Bir sınıf içerisinde en az bir abstract metot varsa sınıfın kendisi de abstract olmalı.
  • Abstract olarak belirtilmiş fonksiyonlar extend eden sınıflarda da mutlaka tanımlanmalıdır.
  • Constructors (yapıcı metodlar) ve destructors (yıkıcı metodlar) bulundurabilirler.
  • Static fonksiyonlar tanımlanabilir ve kullanılabilir. public static function test() gibi

Abstract ile ondan miras alan sınıflar arasında çok kaba bir anlatımla miras alan sınıfın ne olduğunu işaret eden bir anlam vardır.

Yani örneğimizi ele alacak olursak:

  • Samsung bir telefondur.
  • iPhone bir telefondur.

her ikisi de bir telefonda olan ortak özellikleri Phone sınıfından alabilirler.

--

--