Nesne yönelimli programlama yaparken kalıtım ve tekrar kullanım başlıkları önemli rol oynuyor. PHP üzerinde sınıflar tanımlanırken kullanabileceğimiz konseptlerden birkaçını aşağıda karşılaştırarak anlatmaya çalışacağım.
Trait
Pek çok sınıfta kullanma durumumuz olabilecek method ve değerleri bir trait içine toplayarak bunu ilgili sınıflara uygulanabilir.
Bir sınıfa birden fazla trait uygulanabilir. Uygulanırken use anahtar kelimesi kullanılır.
Trait içinde tanımlanmış bir method sınıf içinde de tanımlanırsa bu tanım geçerli olacaktır, trait içindeki tanımı geçersiz kılacaktır.
trait StockManagement { protected $stock; public function checkStock() { return $this->stock > 0; } public function reduceStock($quantity = 1) { /* kod */ } } class LimitedStockProduct { use StockManagement; public function __construct($initialStock) { $this->stock = $initialStock; } } class UnlimitedStockProduct { use StockManagement; public function __construct() { // Sınırsız stok $this->stock = -1; } // trait içinde methodu geçersiz kıldık public function checkStock() { return true; } }
Yukarıdaki örnekte iki tip ürün için stok yönetimi trait’i tanımladık. Fakat sınırsız stoklu ürün için stok kontrolü methodunu geçersiz kıldık.
Interface
Türkçesi arayüz olan interface ise sınıfımız yapısı için bir şablon bir kalıp oluşturmamıza yarar.
Bu şablonda tanımlı methodların içini doldurmak sınıfın işidir, interface sadece sınıfta tanımlanması zorunlu olan elemanları barındırır. Trait’ten en büyük farkı da buradadır.
Bir sınıfa birden fazla interface uygulanabilir. Uygulanırken implements anahtar kelimesi kullanılır.
// Ödeme işlemi başlatma yeteneği için bir arayüz (interface) interface PaymentGateway { public function initiatePayment($amount); } // Farklı ödeme sağlayıcılarını temsil eden sınıflar class PayPal implements PaymentGateway { public function initiatePayment($amount) { // PayPal ödeme işlemi başlatma kodu echo "PayPal ile $amount TL tutarında ödeme başlatıldı."; } } class Stripe implements PaymentGateway { public function initiatePayment($amount) { // Stripe ödeme işlemi başlatma kodu echo "Stripe ile $amount TL tutarında ödeme başlatıldı."; } }
Yukarıdaki örnekte implement ettiğimiz PaymentGateway arayüzü sayfasında diğer iki sınıfımızda initiatePayment metodu olması gerektiğini anlıyoruz. Eğer bu metodu tanımlamazsak hata ile karşılaşırız.