Menu
Coddy logo textTech

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ı gerekir. İşte trait'lerdeki soyut metotlar burada işe yarar; bunlar, kullanan sınıfın yerine getirmesi gereken bir sözleşme tanımlar.

Bir trait soyut bir metot bildirdiğinde, bu trait’i kullanan herhangi bir sınıf onu uygulamalıdır:

<?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ığı ele alırken sınıfa özgü ayrıntıları uygulayan sınıfa devrettiği güçlü bir yapı oluşturur.

Bir sınıf, soyut metodu uygulamadan trait’i kullanırsa PHP ölümcül bir hata verir. Bu, trait’lerin belirli metotların varlığına güvenli bir şekilde bağlı olabilmesini sağlayarak kodunuzu daha öngörülebilir ve sürdürülebilir kılar.

challenge icon

Görev

Kolay

Farklı ürün türlerinin nihai fiyatlarını farklı şekilde hesapladığı, ancak soyut bir yöntem içeren bir trait aracılığıyla ortak indirim mantığını paylaştıkları bir fiyatlandırma sistemi oluşturalım.

Kodunuzu üç dosyaya ayıracaksınız:

  • Discountable.php: İndirim işlevselliği sağlayan Discountable adlı bir trait oluşturun. Trait şunlara sahip olmalıdır:
    • Bu trait'i kullanan sınıfların uygulaması gereken soyut bir getBasePrice(): float yöntemi
    • Temel fiyata indirim yüzdesini uyguladıktan sonraki fiyatı hesaplayıp döndüren bir applyDiscount(int $percent) yöntemi
    • 2 ondalık basamak içeren biçimlendirilmiş bir dize döndüren bir getFinalPrice(int $percent) yöntemi: "Final price: $[discounted_price]"
    Trait tüm indirim hesaplamalarını gerçekleştirir, ancak temel fiyatın ne olduğunu her sınıfın belirtmesine dayanır.
  • Product.php: Discountable trait'ini kullanan bir Product sınıfı oluşturun. Trait dosyasını dahil edin. Özel bir $name (string) ve özel bir $price (float) tanımlamak için kurucu özelliği tanıtımını kullanın. Ürünün fiyatını döndürecek gerekli getBasePrice() yöntemini uygulayın.
  • main.php: Product dosyasını dahil edin. Üç girdi alacaksınız: bir ürün adı, bir fiyat ve bir indirim yüzdesi. Bir Product örneği oluşturun ve iki satır yazdırın:
    • 2 ondalık basamak içeren "Base: $[price]" biçiminde biçimlendirilmiş temel fiyat
    • İndirim yüzdesiyle getFinalPrice() çağrısının sonucu

Bu desen güçlüdür, çünkü Discountable trait'i, getBasePrice() yöntemini uyguladıkları sürece ürünler, hizmetler ve abonelikler gibi herhangi bir sınıf tarafından kullanılabilir. Trait ortak indirim mantığını sağlarken her sınıf temel fiyatının nereden geldiğini tanımlar.

Kendin dene

<?php

require_once 'Product.php';

// Girdileri oku
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$discountPercent = intval(trim(fgets(STDIN)));

// TODO: name ve price ile bir Product örneği oluştur

// TODO: Temel fiyatı "Base: $[price]" biçiminde 2 ondalık basamakla yazdır

// TODO: getFinalPrice() çağrısının sonucunu indirim yüzdesi ile yazdır

?>
quiz iconKendini test et

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

Kendi başına pratik yap: Online PHP derleyicisi