Menu
Coddy logo textTech

Birden Çok Trait Kullanımı

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 52 / 91.

Tek bir trait kullanışlıdır, ancak asıl güç bir sınıfta birden fazla trait’i birleştirdiğinizde ortaya çıkar. PHP, ihtiyaç duyduğunuz kadar trait eklemenize olanak tanır ve sınıfınıza aynı anda birden fazla kaynaktan yetenekler kazandırır.

Birden fazla trait kullanmak için, bunları use anahtar sözcüğünden sonra virgüllerle ayırarak listelemeniz yeterlidir:

<?php
trait Timestampable {
    public function getTimestamp(): string {
        return date('Y-m-d H:i:s');
    }
}

trait Identifiable {
    private string $id;
    
    public function generateId(): void {
        $this->id = uniqid('id_');
    }
    
    public function getId(): string {
        return $this->id;
    }
}

class Post {
    use Timestampable, Identifiable;
    
    public function __construct(public string $title) {
        $this->generateId();
    }
}

$post = new Post("Hello World");
echo $post->getId() . " - " . $post->getTimestamp();

Çıktı:

id_6789abc123 - 2024-01-15 10:30:00

Post sınıfı artık her iki trait'ten gelen metotlara sahip. Her trait kendi işlevselliğini sağlar - Timestampable zamanla ilgili metotlar sunarken Identifiable benzersiz kimlikleri yönetir. Bu yaklaşım, her trait'in tek bir sorumluluğa odaklanmasını sağlayarak kodunuzu daha modüler ve yeniden kullanılabilir hâle getirir.

İki trait aynı ada sahip yöntemlere sahip olduğunda ne olur? Bu, bir sonraki derste inceleyeceğimiz bir çakışma durumudur.

challenge icon

Görev

Kolay

Hem fiyatlandırma hem de envanter özelliklerine sahip ürünler oluşturmak için birden fazla trait'i birleştiren bir ürün yönetim sistemi geliştirelim. Her trait tek bir sorumluluğu üstlenecek ve ürün sınıfınız her ikisinden de işlevsellik kazanacak.

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

  • Priceable.php: Fiyatlandırma işlevselliğini yöneten Priceable adlı bir trait oluşturun. Trait şunlara sahip olmalıdır:
    • Özel bir $price özelliği (float)
    • Fiyatı saklayan bir setPrice(float $price) metodu
    • Fiyatı döndüren bir getPrice() metodu
    • Fiyatı 2 ondalık basamakla getFormattedPrice() biçiminde döndüren bir "$[price]" metodu
  • Stockable.php: Envanteri yöneten Stockable adlı bir trait oluşturun. Trait şunlara sahip olmalıdır:
    • Özel bir $stock özelliği (integer)
    • Stok miktarını saklayan bir setStock(int $quantity) metodu
    • Mevcut stoğu döndüren bir getStock() metodu
    • Stok 0'dan büyükse isInStock(), aksi takdirde true döndüren bir false metodu
  • main.php: Her iki trait dosyasını dahil edin ve hem Product hem de Priceable trait'lerini kullanan bir Stockable sınıfı oluşturun. Genel bir $name özelliği tanımlamak için constructor promotion kullanın. Constructor ayrıca bir fiyat ve stok miktarı kabul etmeli ve bunları ayarlamak için trait metotlarını kullanmalıdır.

    Üç girdi alacaksınız: bir ürün adı, bir fiyat ve bir stok miktarı. Bu değerlerle bir ürün oluşturun ve dört satır yazdırın:

    • Ürün adı
    • Biçimlendirilmiş fiyat (getFormattedPrice() kullanılarak)
    • Stok miktarı
    • Stok varsa "Available", yoksa "Out of stock"

Bu, birden fazla trait'in birlikte nasıl çalıştığını gösterir. Product sınıfınız bir trait'ten fiyatlandırma yetenekleri, diğerinden ise envanter yönetimi kazanır; böylece her sorumluluk düzgün bir şekilde ayrılırken bunlar tam özellikli bir üründe birleştirilir.

Kendin dene

<?php
require_once 'Priceable.php';
require_once 'Stockable.php';

// TODO: Hem Priceable hem de Stockable trait'lerini kullanan bir Product sınıfı oluştur
// public $name özelliği için constructor promotion kullan
// Constructor name, price ve stock kabul etmeli ve price ile stock'u ayarlamak için trait metodlarını kullanmalı

class Product {
    // TODO: Trait'leri burada kullan

    // TODO: $name için constructor promotion ile constructor uygula
    // ve trait metodlarını kullanarak price ve stock'u ayarla
}

// Girdiyi oku
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$stock = intval(trim(fgets(STDIN)));

// TODO: Girdi değerleriyle bir Product örneği oluştur

// TODO: Ürün adını yazdır
// TODO: getFormattedPrice() kullanarak biçimlendirilmiş fiyatı yazdır
// TODO: Stok miktarını yazdır
// TODO: Stokta varsa "Available", yoksa "Out of stock" 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