İ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 (exceptions), yürütme sırasında bir şeylerin ters gittiğini bildirmek için kullanılan nesnelerdir. Tüm istisnalar için temel sınıf Exception sınıfıdır ve yapısını anlamak, OOP uygulamalarınızda hataları etkili bir şekilde yönetmenize yardımcı olur.
Bir istisna (exception) fırlattığınızda, neyin yanlış gittiğini açıklayan bir mesajla birlikte Exception sınıfının (veya bir alt sınıfını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" mesajıyla birlikte yakalanmamış bir istisna hatası oluşturacaktır.
PHP, farklı durumlar için birkaç yerleşik istisna (exception) sınıfı sağlar. InvalidArgumentException hatalı girişi belirtir, RuntimeException çalışma sırasındaki hataları gösterir 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 fırlatıldığını size söyler. Belirli istisna türlerini kullanmak, kodunuzun amacını daha net hale getirir ve daha kesin hata yönetimine olanak tanır.
Görev
KolayFarklı türdeki sorunları bildirmek için PHP'nin yerleşik istisna (exception) 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ız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Product.php— Envanterdeki bir öğeyi temsil eden birProductsınıfı oluşturun. Genel bir$sku(string), genel bir$name(string) ve özel bir$quantity(int) için "constructor promotion" kullanın. Sınıfınız şunlara sahip olmalıdır:- Mevcut miktarı döndüren bir
getQuantity(): intmetodu - Miktarı artıran bir
addStock(int $amount): voidmetodu. Eğer miktar 1'den küçükse,"Amount must be positive"mesajıyla birInvalidArgumentExceptionfırlatın - Miktarı azaltan bir
removeStock(int $amount): voidmetodu. Eğer miktar 1'den küçükse,"Amount must be positive"mesajıyla birInvalidArgumentExceptionfırlatın. Eğer miktar mevcut miktarı aşarsa,"Insufficient stock"mesajıyla birRuntimeExceptionfırlatın
- Mevcut miktarı döndüren bir
Inventory.php— Bir ürün koleksiyonunu yöneten birInventorysınıfı oluşturun. Product dosyasını dahil edin. Sınıfınız şunlara sahip olmalıdır:- Ürünleri SKU'ya göre indekslenmiş şekilde saklamak için özel (private) bir dizi
- Bir ürün ekleyen
addProduct(Product $product): voidmetodu. Aynı SKU'ya sahip bir ürün zaten varsa,"Product already exists: [sku]"mesajıyla birLogicExceptionfırlatın - SKU'ya göre bir ürün döndüren
getProduct(string $sku): Productmetodu. Bulunamazsa,"Product not found: [sku]"mesajıyla birInvalidArgumentExceptionfırlatın
main.php— Inventory dosyasını dahil edin. Üç girdi alacaksınız: bir SKU, bir ürün adı ve bir işlem ("add","remove"veya"duplicate").Bir
Inventoryoluşturun ve verilen SKU, ad ve başlangıç miktarı10olan yeni birProductekleyin.İşleme bağlı olarak:
"add": Ürün üzerindeaddStock(5)metodunu çağırın, ardından"Stock updated: [quantity]"yazdırın"remove": Ürün üzerinderemoveStock(15)metodunu çağırın (bu bir istisna fırlatmalıdır)"duplicate": Aynı SKU ile başka bir ürün eklemeyi deneyin (bu bir istisna fırlatmalıdır)
Bir istisna fırlatıldığında, istisnanın sınıf adını, ardından
": "ve istisnanın mesajını yazdırın. Sınıf adını almak için PHP'ninget_class()fonksiyonunu kullanın.
Bu meydan okuma, farklı istisna türlerinin geçersiz girdi, çalışma zamanı hataları ve mantık hataları gibi farklı türdeki sorunları nasıl ilettiğini göstererek kodunuzun hata yönetimini daha kesin ve anlamlı hale getirir.
Kopya kağıdı
PHP'de istisnalar (exceptions), yürütme sırasında hataları bildiren nesnelerdir. Temel sınıf Exception sınıfıdır.
Bir istisna fırlatmak için, açıklayıcı bir mesaj içeren bir örnek oluşturun:
<?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;
}
}
PHP, farklı durumlar için yerleşik istisna sınıfları sağlar:
InvalidArgumentException— geçersiz girişi bildirirRuntimeException— yürütme sırasındaki hataları belirtirLogicException— 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;
}
}
İstisna nesneleri kullanışlı metotlar sağlar:
getMessage()— hata mesajını döndürürgetCode()— isteğe bağlı bir hata kodunu döndürürgetFile()— istisnanın fırlatıldığı dosyayı döndürürgetLine()— istisnanın fırlatıldığı satır numarasını döndürür
Bir istisna nesnesinin sınıf adını almak için get_class() kullanın.
Kendin dene
<?php
require_once 'Inventory.php';
// Girdileri oku
$sku = trim(fgets(STDIN));
$name = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));
try {
// TODO: Bir Envanter (Inventory) oluşturun
// TODO: Verilen SKU, isim ve 10 başlangıç miktarı ile bir Ürün (Product) oluşturun
// TODO: Ürünü envantere ekleyin
// TODO: İşleme bağlı olarak:
// - "add": Ürün üzerinde addStock(5) çağırın, ardından "Stock updated: [quantity]" yazdırın
// - "remove": Ürün üzerinde removeStock(15) çağırın
// - "duplicate": Aynı SKU'ya sahip başka bir ürün eklemeyi deneyin
} catch (Exception $e) {
// TODO: İstisna sınıf adını, ardından ": " ve mesajı yazdırın
// İpucu: Sınıf adını almak için get_class($e) kullanı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