İstisna Sınıfları
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 66 / 91.
PHP'de istisnalar, yürütme sırasında bir şeylerin ters gittiğini belirtmek için kullanılan nesnelerdir. Tüm istisnaların temel sınıfı Exception'dır ve yapısını anlamak, OOP uygulamalarınızdaki hataları etkili bir şekilde yönetmenize yardımcı olur.
Bir istisna fırlattığınızda, neyin yanlış gittiğini açıklayan bir iletiyle Exception sınıfının (veya bir alt sınıfın) bir örneğini oluşturursunuz:
<?php
class BankAccount {
public function __construct(private float $balance = 0) {}
public function withdraw(float $amount): float {
if ($amount > $this->balance) {
throw new Exception("Insufficient funds");
}
$this->balance -= $amount;
return $amount;
}
}
$account = new BankAccount(100);
$account->withdraw(150);
Bu, "Insufficient funds" iletisini içeren yakalanmamış bir istisna hatası oluşturur.
PHP, farklı durumlar için yerleşik birkaç istisna sınıfı sağlar. InvalidArgumentException hatalı girdiyi bildirir, RuntimeException yürütme sırasında oluşan hataları belirtir ve LogicException programlama hatalarını temsil eder:
<?php
class Calculator {
public function divide(int $a, int $b): float {
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
}
Her istisna nesnesi yararlı bilgiler taşır: getMessage() hata mesajını döndürür, getCode() isteğe bağlı bir hata kodu döndürür, getFile() ve getLine() istisnanın nerede oluşturulduğunu size bildirir. Belirli istisna türlerini kullanmak, kodunuzun amacını daha anlaşılır hâle getirir ve daha kesin hata işlemeye olanak tanır.
Görev
KolayFarklı türdeki sorunları belirtmek için PHP'nin yerleşik istisna sınıflarını kullanan bir envanter yönetim sistemi oluşturalım. İşlemlerin belirli ve anlamlı şekillerde başarısız olabileceği bir ürün envanteri oluşturacaksın.
Kodunu üç dosyada düzenleyeceksin:
Product.php: Envanterdeki bir öğeyi temsil eden birProductsınıfı oluştur. Genel bir$sku(string), genel bir$name(string) ve özel bir$quantity(int) için kurucu destekli özellik tanımlamayı kullan. Sınıfında şunlar bulunmalı:- Mevcut miktarı döndüren bir
getQuantity(): intyöntemi - Miktarı artıran bir
addStock(int $amount): voidyöntemi. Miktar 1'den küçükse"Amount must be positive"mesajıyla birInvalidArgumentExceptionfırlat - Miktarı azaltan bir
removeStock(int $amount): voidyöntemi. Miktar 1'den küçükse"Amount must be positive"mesajıyla birInvalidArgumentExceptionfırlat. Miktar mevcut miktarı aşarsa"Insufficient stock"mesajıyla birRuntimeExceptionfırlat
- Mevcut miktarı döndüren bir
Inventory.php: Ürünlerden oluşan bir koleksiyonu yöneten birInventorysınıfı oluştur. Product dosyasını dahil et. Sınıfında şunlar bulunmalı:- Ürünleri SKU'ya göre indekslenmiş şekilde depolayan özel bir dizi
- Bir ürün ekleyen
addProduct(Product $product): voidyöntemi. Aynı SKU'ya sahip bir ürün zaten varsa"Product already exists: [sku]"mesajıyla birLogicExceptionfırlat - SKU'ya göre bir ürün döndüren
getProduct(string $sku): Productyöntemi. Ürün bulunamazsa"Product not found: [sku]"mesajıyla birInvalidArgumentExceptionfırlat
main.php: Inventory dosyasını dahil et. Üç girdi alacaksın: bir SKU, bir ürün adı ve bir işlem ("add","remove"veya"duplicate").Bir
Inventoryoluştur ve verilen SKU, ad ve10başlangıç miktarıyla yeni birProductekle.İşleme göre:
"add": Ürün üzerindeaddStock(5)çağır, ardından"Stock updated: [quantity]"yazdır"remove": Ürün üzerinderemoveStock(15)çağır (bu işlem bir istisna fırlatmalı)"duplicate": Aynı SKU'ya sahip başka bir ürün eklemeyi dene (bu işlem bir istisna fırlatmalı)
Bir istisna fırlatıldığında, istisnanın sınıf adını ve ardından
": "ile istisnanın mesajını yazdır. Sınıf adını almak için PHP'ninget_class()işlevini kullan.
Bu görev, farklı istisna türlerinin farklı sorun türlerini (geçersiz girdi, çalışma zamanı hataları ve mantık hataları) nasıl ilettiğini gösterir ve kodunun hata işlemesini daha kesin ve anlamlı hâle getirir.
Kendin dene
<?php
require_once 'Inventory.php';
// Girdileri oku
$sku = trim(fgets(STDIN));
$name = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));
try {
// TODO: Bir Inventory oluştur
// TODO: Verilen SKU, name ve başlangıç miktarı 10 ile bir Product oluştur
// TODO: Ürünü envantere ekle
// TODO: operation değerine göre:
// - "add": Call addStock(5) on the product, then print "Stock updated: [quantity]"
// - "remove": product üzerinde removeStock(15) çağır
// - "duplicate": Aynı SKU ile başka bir product eklemeyi dene
} catch (Exception $e) {
// TODO: Exception sınıf adını ardından ": " ve mesajı yazdır
// Hint: Sınıf adını almak için get_class($e) kullan
}
?>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