Trait'lerde Soyut Metotlar
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 54 / 91.
Trait'ler kullanıma hazır metotlar sağlayabilir, ancak bazen trait'i kullanan sınıfın belirli bir işlevselliği uygulamasını sağlamanız gerekir. İşte burada trait'lerdeki soyut metotlar (abstract methods) kullanışlı hale gelir; bunlar, kullanan sınıfın yerine getirmesi gereken bir sözleşme tanımlarlar.
Bir trait soyut (abstract) bir metot bildirdiğinde, bu trait'i kullanan her sınıfın bu metodu uygulaması gerekir:
<?php
trait Notifiable {
abstract public function getEmail(): string;
public function sendNotification(string $message): void {
echo "Sending to " . $this->getEmail() . ": $message";
}
}
class User {
use Notifiable;
public function __construct(private string $email) {}
public function getEmail(): string {
return $this->email;
}
}
$user = new User("john@example.com");
$user->sendNotification("Welcome!");
Çıktı:
Sending to john@example.com: Welcome!Trait, sendNotification() metodunu sağlar ancak getEmail() metodunun sınıf tarafından uygulanmasına dayanır. Bu, trait'in ortak mantığı yürüttüğü, sınıfa özgü ayrıntıları ise uygulayan sınıfa devrettiği güçlü bir desen oluşturur.
Eğer bir sınıf, soyut metodu (abstract method) uygulamadan trait'i kullanırsa, PHP ölümcül bir hata (fatal error) fırlatır. Bu, trait'lerin belirli metodların varlığına güvenli bir şekilde dayanabilmesini sağlayarak kodunuzu daha öngörülebilir ve bakımı kolay hale getirir.
Görev
KolayFarklı ürün türlerinin nihai fiyatlarını farklı şekilde hesapladığı, ancak hepsinin soyut bir metoda sahip bir trait aracılığıyla ortak indirim mantığını paylaştığı bir fiyatlandırma sistemi kuralım.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Discountable.php— İndirim işlevselliği sağlayanDiscountableadında bir trait oluşturun. Trait şunlara sahip olmalıdır:- Bu traiti kullanan sınıfların uygulaması gereken soyut bir
getBasePrice(): floatmetodu - İndirim yüzdesini taban fiyata uyguladıktan sonra fiyatı hesaplayan ve döndüren bir
applyDiscount(int $percent)metodu - Şu formatta bir dize döndüren
getFinalPrice(int $percent)metodu: 2 ondalık basamaklı"Final price: $[discounted_price]"
- Bu traiti kullanan sınıfların uygulaması gereken soyut bir
Product.php—Discountabletraitini kullanan birProductsınıfı oluşturun. Trait dosyasını dahil edin. Özel bir$name(string) ve özel bir$price(float) tanımlamak için constructor promotion kullanın. Ürünün fiyatını döndürmek için gerekligetBasePrice()metodunu uygulayın.main.php— Product dosyasını dahil edin. Üç girdi alacaksınız: bir ürün adı, bir fiyat ve bir indirim yüzdesi. BirProductörneği oluşturun ve iki satır yazdırın:- 2 ondalık basamaklı
"Base: $[price]"olarak formatlanmış taban fiyat - İndirim yüzdesi ile
getFinalPrice()metodunu çağırmanın sonucu
- 2 ondalık basamaklı
Bu desen güçlüdür çünkü Discountable traiti, getBasePrice() metodunu uyguladıkları sürece ürünler, hizmetler, abonelikler gibi herhangi bir sınıf tarafından kullanılabilir. Trait paylaşılan indirim mantığını sağlarken, her sınıf kendi taban fiyatının nereden geldiğini tanımlar.
Kopya kağıdı
Trait'ler, trait'i kullanan herhangi bir sınıf tarafından uygulanması gereken soyut metotlar (abstract methods) bildirebilir:
<?php
trait Notifiable {
abstract public function getEmail(): string;
public function sendNotification(string $message): void {
echo "Sending to " . $this->getEmail() . ": $message";
}
}
class User {
use Notifiable;
public function __construct(private string $email) {}
public function getEmail(): string {
return $this->email;
}
}
Trait, kullanıma hazır metotlar sağlarken sınıfın belirli işlevleri uygulamasını zorunlu kılar. Eğer bir sınıf, soyut metodu uygulamadan trait'i kullanırsa, PHP ölümcül bir hata (fatal error) fırlatır.
Bu desen, trait'lerin ortak mantığı yürütmesine izin verirken sınıfa özgü detayları uygulayan sınıfa devreder.
Kendin dene
<?php
require_once 'Product.php';
// Girdileri oku
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$discountPercent = intval(trim(fgets(STDIN)));
// YAPILACAK: İsim ve fiyat ile bir Product örneği oluşturun
// YAPILACAK: Temel fiyatı 2 ondalık basamakla "Base: $[price]" olarak biçimlendirilmiş şekilde yazdırın
// YAPILACAK: İndirim yüzdesi ile getFinalPrice() çağrısının sonucunu yazdırın
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi