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:00Post 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.
Görev
KolayHem 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önetenPriceableadlı 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
- Özel bir
Stockable.php: Envanteri yönetenStockableadlı 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 takdirdetruedöndüren birfalsemetodu
- Özel bir
main.php: Her iki trait dosyasını dahil edin ve hemProducthem dePriceabletrait'lerini kullanan birStockablesı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
?>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 SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarı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ıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi