Çoklu 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üç birden fazla trait'i tek bir sınıfta birleştirdiğinizde ortaya çıkar. PHP, ihtiyacınız olan sayıda trait eklemenize izin vererek sınıfınıza aynı anda birkaç kaynaktan yetenekler kazandırır.
Birden fazla trait kullanmak için, use anahtar kelimesinden sonra bunları virgülle 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 de metotlara sahiptir. Her trait kendi işlevselliğini katar - Timestampable zamanla ilgili metotlar sağlarken, Identifiable benzersiz kimlikleri (ID) yönetir. Bu yaklaşım, her trait'in tek bir sorumluluğa odaklanmasını sağlayarak kodunuzu daha modüler ve yeniden kullanılabilir hale getirir.
İki trait aynı isme sahip metotlara sahip olduğunda ne olur? Bu, bir sonraki derste inceleyeceğimiz bir çakışma durumudur.
Görev
KolayÜrünlere hem fiyatlandırma hem de envanter yetenekleri kazandırmak için birden fazla trait'i birleştiren bir ürün yönetim sistemi oluşturalım. Her trait tek bir sorumluluğu üstlenecek ve ürün sınıfınız her ikisinden de işlevsellik kazanacaktır.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Priceable.php— Fiyatlandırma işlevselliğini yönetenPriceableadında bir trait oluşturun. Trait şunlara sahip olmalıdır:- Özel (private) bir özellik
$price(float) - Fiyatı kaydeden bir
setPrice(float $price)metodu - Fiyatı döndüren bir
getPrice()metodu - Fiyatı 2 ondalık basamaklı
"$[price]"olarak biçimlendirilmiş şekilde döndüren birgetFormattedPrice()metodu
- Özel (private) bir özellik
Stockable.php— Envanteri yönetenStockableadında bir trait oluşturun. Trait şunlara sahip olmalıdır:- Özel (private) bir özellik
$stock(integer) - Stok miktarını kaydeden bir
setStock(int $quantity)metodu - Mevcut stoğu döndüren bir
getStock()metodu - Stok 0'dan büyükse
true, aksi takdirdefalsedöndüren birisInStock()metodu
- Özel (private) bir özellik
main.php— Her iki trait dosyasını da dahil edin ve hemPriceablehem deStockabletrait'lerini kullanan birProductsınıfı oluşturun. Genel (public) bir$nameözelliği tanımlamak için constructor promotion kullanın. Yapıcı metod (constructor) ayrıca bir fiyat ve stok miktarı kabul etmeli ve bunları ayarlamak için trait metodları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()kullanarak) - Stok miktarı
- Stokta 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 envanter yönetimi kazanarak her bir konuyu düzgün bir şekilde ayrı tutarken bunları tam özellikli bir üründe birleştirir.
Kopya kağıdı
Bir sınıfta birden fazla trait kullanmak için, bunları use anahtar kelimesinden sonra virgülle ayırarak listeleyin:
<?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
Her bir trait, sınıfa kendi işlevselliğini katar. Bu yaklaşım, her bir trait'in tek bir sorumluluğa odaklanmasını sağlayarak kodu daha modüler ve yeniden kullanılabilir hale getirir.
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şturun
// public $name özelliği için constructor promotion kullanın
// Constructor; name, price ve stock değerlerini kabul etmeli ve fiyat ile stok bilgilerini ayarlamak için trait metotlarını kullanmalıdır
class Product {
// TODO: Trait'leri burada kullanın
// TODO: $name için constructor promotion kullanarak constructor'ı uygulayın
// ve trait metotlarını kullanarak fiyat ve stok bilgilerini ayarlayın
}
// 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şturun
// TODO: Ürün adını yazdırın
// TODO: getFormattedPrice() kullanarak formatlanmış fiyatı yazdırın
// TODO: Stok miktarını yazdırın
// TODO: Stokta varsa "Available", yoksa "Out of stock" 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