Özel İstisna Hiyerarşisi
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 67 / 91.
PHP'nin yerleşik istisna sınıfları yaygın senaryoları kapsasa da gerçek uygulamalar çoğu zaman daha özel hata türlerine ihtiyaç duyar. Özel bir istisna hiyerarşisi oluşturmak, alanınıza uygun istisnalar tanımlamanıza ve bunları farklı özgüllük düzeylerinde yakalamanıza olanak tanır.
Özel bir istisna oluşturmak için Exception sınıfını veya onun alt sınıflarından birini genişletmeniz yeterlidir:
<?php
class PaymentException extends Exception {}
class InsufficientFundsException extends PaymentException {
public function __construct(
private float $required,
private float $available
) {
parent::__construct("Need $required but only $available available");
}
public function getShortfall(): float {
return $this->required - $this->available;
}
}
InsufficientFundsException sınıfının doğrudan Exception sınıfını değil, PaymentException sınıfını genişlettiğine dikkat edin. Bu, tüm ödemeyle ilgili istisnaları tek bir catch bloğuyla yakalayabileceğiniz veya belirli istisnaları ayrı ayrı ele alabileceğiniz bir hiyerarşi oluşturur.
Özel istisneler, hatayla ilgili ek özellikler ve yöntemler içerebilir. Burada getShortfall(), genel bir istisnanın sunamayacağı yararlı bilgiler sağlar:
<?php
class Wallet {
public function __construct(private float $balance) {}
public function pay(float $amount): void {
if ($amount > $this->balance) {
throw new InsufficientFundsException($amount, $this->balance);
}
$this->balance -= $amount;
}
}
İyi tasarlanmış bir istisna hiyerarşisi, kodunuzun bakımını daha kolay hale getirir. İstisnaları yakalarken gerektiği kadar genel veya özel olabilirsiniz ve istisna nesnelerinin kendileri, neyin yanlış gittiği hakkında anlamlı bağlam taşır.
Görev
KolayFarklı türlerdeki sipariş hatalarını işleyen özel bir istisna hiyerarşisine sahip bir sipariş işleme sistemi oluşturalım. Neyin yanlış gittiği hakkında anlamlı bağlam taşıyan istisnalar oluşturacak ve böylece hata işlemeyi daha kesin ve bilgilendirici hâle getireceksin.
Kodunu dört dosyaya ayıracaksın:
OrderException.php:Exceptionsınıfını genişleten temel birOrderExceptionsınıfı oluştur. Bu sınıf, siparişle ilgili tüm istisnaların üst sınıfı olarak görev yapar ve gerektiğinde tek bir catch bloğuyla herhangi bir sipariş sorununu yakalamanı sağlar.OutOfStockException.php:OrderExceptionsınıfını genişleten birOutOfStockExceptionsınıfı oluştur. Bu istisna, yapıcısında bir ürün adını ve istenen miktarı kabul etmelidir. Bu özel özellikler için yapıcı destekli özellik tanımlamayı kullan. Üst sınıfın yapıcısını"[productName] is out of stock (requested: [quantity])"biçimindeki bir iletiyle çağır. Ürün adını döndürengetProductName(): stringmetodunu ekle.InvalidQuantityException.php:OrderExceptionsınıfını genişleten birInvalidQuantityExceptionsınıfı oluştur. Bu istisna, yapıcısında yapıcı destekli özel bir özellik olarak bir miktar değerini kabul etmelidir. Üst sınıfın yapıcısını"Invalid quantity: [quantity]"iletisiyle çağır. Miktar değerini döndürengetQuantity(): intmetodunu ekle.main.php: Her üç istisna dosyasını da dahil et. İki girdi alacaksın: bir ürün adı ve tamsayıya dönüştürülmesi gereken bir dize olarak miktar.Miktar değerine göre uygun istisnayı fırlat:
- Miktar 1'den küçükse bir
InvalidQuantityExceptionfırlat - Miktar 100'den büyükse bir
OutOfStockExceptionfırlat (yetersiz stok durumunu simüle eder) - Aksi takdirde
"Order placed: [quantity]x [productName]"çıktısını yazdır
İstisnaları hiyerarşiyi kullanarak yakala. Önce
InvalidQuantityExceptionistisnasını yakala ve istisnanın iletisini vegetQuantity()metodunu kullanarak"Quantity error: [message] (value: [quantity])"çıktısını yazdır. ArdındanOutOfStockExceptionistisnasını yakala ve istisnanın iletisini vegetProductName()metodunu kullanarak"Stock error: [message] (product: [productName])"çıktısını yazdır.- Miktar 1'den küçükse bir
Bu hiyerarşi, belirli istisnaları ayrı ayrı işlemeni sağlarken aynı zamanda temel OrderException sınıfı aracılığıyla siparişle ilgili tüm sorunları yakalama seçeneğini de sunar. Her istisnadaki özel metotlar, genel bir istisnanın sağlayamayacağı bağlamı sunar.
Kendin dene
<?php
// Tüm exception dosyalarını dahil et
require_once 'OrderException.php';
require_once 'OutOfStockException.php';
require_once 'InvalidQuantityException.php';
// Girdiyi oku
$productName = trim(fgets(STDIN));
$quantity = intval(trim(fgets(STDIN)));
// TODO: Sipariş işlemeyi yönetmek için try-catch kullan
// try bloğu içinde:
// - Eğer quantity < 1 ise, InvalidQuantityException fırlat
// - Eğer quantity > 100 ise, OutOfStockException fırlat
// - Aksi halde, "Order placed: [quantity]x [productName]" yazdır
//
// Önce InvalidQuantityException'ı yakala:
// - getMessage() ve getQuantity() kullanarak "Quantity error: [message] (value: [quantity])" yazdır
//
// OutOfStockException'ı yakala:
// - getMessage() ve getProductName() kullanarak "Stock error: [message] (product: [productName])" 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 Koleksiyon11Tür Sistemi ve Hata Yönetimi
Tür BildirimleriNullable TürlerBirleşim ve Kesişim Türleriİstisna SınıflarıÖzel İstisna HiyerarşisiTry, Catch, FinallyTekrar - Form Doğrulayıcı3Sı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