Menu
Coddy logo textTech

İ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.

challenge icon

Görev

Kolay

Farklı 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 bir Product sı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(): int yöntemi
    • Miktarı artıran bir addStock(int $amount): void yöntemi. Miktar 1'den küçükse "Amount must be positive" mesajıyla bir InvalidArgumentException fırlat
    • Miktarı azaltan bir removeStock(int $amount): void yöntemi. Miktar 1'den küçükse "Amount must be positive" mesajıyla bir InvalidArgumentException fırlat. Miktar mevcut miktarı aşarsa "Insufficient stock" mesajıyla bir RuntimeException fırlat
  • Inventory.php: Ürünlerden oluşan bir koleksiyonu yöneten bir Inventory sı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): void yöntemi. Aynı SKU'ya sahip bir ürün zaten varsa "Product already exists: [sku]" mesajıyla bir LogicException fırlat
    • SKU'ya göre bir ürün döndüren getProduct(string $sku): Product yöntemi. Ürün bulunamazsa "Product not found: [sku]" mesajıyla bir InvalidArgumentException fı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 Inventory oluştur ve verilen SKU, ad ve 10 başlangıç miktarıyla yeni bir Product ekle.

    İşleme göre:

    • "add": Ürün üzerinde addStock(5) çağır, ardından "Stock updated: [quantity]" yazdır
    • "remove": Ürün üzerinde removeStock(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'nin get_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
}

?>
quiz iconKendini test et

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

Kendi başına pratik yap: Online PHP derleyicisi