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

challenge icon

Görev

Kolay

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

    İşleme bağlı olarak:

    • "add": Ürün üzerinde addStock(5) metodunu çağırın, ardından "Stock updated: [quantity]" yazdırın
    • "remove": Ürün üzerinde removeStock(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'nin get_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 bildirir
  • RuntimeException — yürütme sırasındaki hataları belirtir
  • 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;
    }
}

İstisna nesneleri kullanışlı metotlar sağlar:

  • getMessage() — hata mesajını döndürür
  • getCode() — isteğe bağlı bir hata kodunu döndürür
  • getFile() — istisnanın fırlatıldığı dosyayı döndürür
  • getLine() — 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
}

?>
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