Birleşim ve Kesişim Tipleri
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 65 / 91.
Boş bırakılabilir (nullable) türler bir türü veya null değerini kabul etmenize olanak tanırken, birleşim türleri (union types) (PHP 8.0+), bir parametrenin veya dönüş değerinin birden fazla farklı türü kabul etmesine olanak tanır. İzin verilen türleri ayırmak için dikey çizgi | karakterini kullanın:
<?php
class Formatter {
public function format(int|float $number): string {
return number_format($number, 2);
}
}
$formatter = new Formatter();
echo $formatter->format(42) . "\n";
echo $formatter->format(3.14159);
Çıktı:
42.00
3.14Birleşim türleri (Union types), bir metodun farklı ancak ilişkili türlerle çalışabildiği durumlarda özellikle kullanışlıdır. Sınıf adları ve arayüzler de dahil olmak üzere, ihtiyaç duyduğunuz kadar türü birleştirebilirsiniz:
<?php
class Logger {
public function log(string|array|Stringable $message): void {
if (is_array($message)) {
$message = implode(", ", $message);
}
echo "Log: $message";
}
}
Kesişim türleri (PHP 8.1+) bunun tam tersidir; bir değerin belirtilen tüm türleri aynı anda uygulamasını gerektirirler. Bunları birleştirmek için ampersand & işaretini kullanın:
<?php
interface Printable {
public function print(): string;
}
interface Saveable {
public function save(): void;
}
class DocumentHandler {
public function process(Printable&Saveable $doc): void {
echo $doc->print();
$doc->save();
}
}
Burada, process() yalnızca hem Printable hem de Saveable uygulayan nesneleri kabul eder. Bu, metod çalışmadan önce nesnenin gerekli tüm yeteneklere sahip olmasını sağlayarak kodunuzu daha güvenli ve daha ifade edici hale getirir.
Görev
KolayHem birleşim (union) türlerini hem de kesişim (intersection) türlerini gösteren bir veri işlemcisi oluşturalım. Birden fazla girdi formatını işleyebilen ve belirli işlemler için nesnelerin birden fazla arayüzü (interface) uygulamasını gerektiren bir sistem oluşturacaksınız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Interfaces.php— Farklı yetenekleri temsil eden iki arayüz tanımlayın:export(): stringmetoduna sahipExportablelog(): stringmetoduna sahipLoggable
DataProcessor.php— Hem birleşim hem de kesişim türlerini sergileyen birDataProcessorsınıfı oluşturun. Interfaces dosyasını dahil edin. Sınıfınız şunlara sahip olmalıdır:- Bu türlerden herhangi birini dizeye dönüştüren bir
normalize(int|float|string $value): stringmetodu. Sayılar için onları 2 ondalık basamakla formatlayın. Dizeler için onları olduğu gibi döndürün. - Karışık değerlerden (tam sayılar, ondalıklı sayılar veya dizeler) oluşan bir diziyi kabul eden, yukarıdaki metodu kullanarak her birini normalleştiren ve bunları
" | "ile birleştirilmiş olarak döndüren birprocessMultiple(array $values): stringmetodu. - Her iki arayüzü de uygulayan bir nesne gerektirmek için bir kesişim türü kullanan bir
handleDocument(Exportable&Loggable $doc): stringmetodu. Bu metod,log()çağrısının sonucunu, ardından" -> "ve ardındanexport()çağrısının sonucunu döndürmelidir.
- Bu türlerden herhangi birini dizeye dönüştüren bir
main.php— DataProcessor dosyasını dahil edin. İki girdi alacaksınız: bir tür göstergesi ("int","float"veya"string") ve bir değer.Bir
DataProcessoroluşturun ve girdi değerini göstergeye göre uygun türe dönüştürün. Ardından bu değerlenormalize()metodunu çağırın ve sonucu yazdırın.Ardından, hem
Exportablehem deLoggablearayüzlerini uygulayan anonim bir sınıf oluşturun.export()metodu"Exported data"döndürmeli velog()metodu"Logged"döndürmelidir. Bu nesneyihandleDocument()metoduna geçirin ve sonucu yeni bir satırda yazdırın.
Bu meydan okuma, esnek girdi işleme için birleşim türlerini, nesnelerin birden fazla gerekli yeteneğe sahip olmasını sağlamak için kesişim türleriyle birleştirir; her ikisi de sağlam, tür güvenli PHP uygulamaları oluşturmak için güçlü özelliklerdir.
Kendin dene
<?php
require_once 'DataProcessor.php';
// Girişi oku
$type = trim(fgets(STDIN));
$value = trim(fgets(STDIN));
// TODO: Bir DataProcessor örneği oluşturun
// TODO: $value değerini $type göstergesine göre uygun türe dönüştürün
// ("int", "float" veya "string")
// TODO: Dönüştürülen değerle normalize() metodunu çağırın ve sonucu yazdırın
// TODO: Hem Exportable hem de Loggable arayüzlerini uygulayan anonim bir sınıf oluşturun
// - export() "Exported data" döndürmeli
// - log() "Logged" döndürmeli
// TODO: Anonim sınıf örneğini handleDocument() metoduna geçirin ve sonucu 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 Koleksiyon11Tip Sistemi ve Hata Yönetimi
Tip BildirimleriNullable TiplerBirleşim ve Kesişim Tipleriİstisna SınıflarıÖzel İstisna HiyerarşisiTry, Catch, FinallyÖzet - Form Doğrulayıcı3Sı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