Menu
Coddy logo textTech

Enum'lar (PHP 8.1)

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 59 / 91.

PHP 8.1'den önce, durumlar veya türler gibi sabit bir değer kümesini temsil etmek, sınıf sabitlerini veya sihirli dizeleri (magic strings) kullanmak anlamına geliyordu; her iki yaklaşım da hataya açıktı. Enums (numaralandırmalar), yalnızca belirli, önceden tanımlanmış değerleri tutabilen bir tür tanımlamak için uygun bir yol sağlar.

enum anahtar kelimesini kullanarak bir enum tanımlayın:

<?php
enum Status {
    case Pending;
    case Active;
    case Completed;
}

$status = Status::Active;
echo $status->name;

Çıktı:

Active

Enum'lar ayrıca her bir case ile ilişkilendirilmiş string veya integer değerler olan desteklenen değerlere (backed values) sahip olabilir. Bu, enum'ları veritabanlarında veya API'lerde saklarken kullanışlıdır:

<?php
enum Status: string {
    case Pending = 'pending';
    case Active = 'active';
    case Completed = 'completed';
}

$status = Status::Active;
echo $status->value;

Çıktı:

active

Backed enum'lar, bir değerden enum oluşturmak için bir from() metodu ve geçersiz değerler için hata fırlatmak yerine null döndüren tryFrom() metodunu sunar:

<?php
$status = Status::from('active');      // Status::Active döndürür
$invalid = Status::tryFrom('unknown'); // null döndürür

Enum'lar ayrıca metotlar da içerebilir, bu da onları ilgili mantığı kapsüllemek için güçlü kılar. Tip ipuçlarıyla (type hints) sorunsuz çalışarak fonksiyonlarınızın yalnızca geçerli değerleri kabul etmesini sağlarlar; artık bir dizenin beklenen seçeneklerle eşleşip eşleşmediğini kontrol etmenize gerek kalmaz.

challenge icon

Görev

Kolay

Sipariş durumlarını tip güvenli bir şekilde temsil etmek için enum'ları kullanan bir sipariş yönetim sistemi oluşturalım. Yanlış yazılabilecek veya geçersiz olabilecek dizelere güvenmek yerine, her durumu veritabanı dostu bir değerle eşleyen bir backed enum oluşturacaksınız.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • OrderStatus.php — Dört durumu olan OrderStatus adında dize tabanlı (string-backed) bir enum oluşturun:
    • 'pending' ile desteklenen Pending
    • 'processing' ile desteklenen Processing
    • 'shipped' ile desteklenen Shipped
    • 'delivered' ile desteklenen Delivered
    Her durum için insan tarafından okunabilir bir açıklama döndüren bir label() yöntemi ekleyin:
    • Pending şunı döndürür: "Awaiting confirmation"
    • Processing şunu döndürür: "Being prepared"
    • Shipped şunu döndürür: "On the way"
    • Delivered şunu döndürür: "Order complete"
  • Order.php — Enum'ı kullanan bir Order sınıfı oluşturun. OrderStatus dosyasını dahil edin. Sınıf şunları yapmalıdır:
    • Constructor promotion kullanarak yapıcı metodunda bir sipariş kimliği (string) ve bir OrderStatus kabul etmelidir
    • "Order [id]: [status label]" döndüren bir getInfo() yöntemine sahip olmalıdır
    • Durumun desteklenen değerini (veritabanı depolaması için yararlıdır) döndüren bir getStatusValue() yöntemine sahip olmalıdır
  • main.php — Order dosyasını dahil edin. İki girdi alacaksınız: bir sipariş kimliği ve bir durum dizesi (örneğin "shipped"). Dize girdisini güvenli bir şekilde bir OrderStatus enum'ına dönüştürmek için tryFrom() kullanın. Durum geçerliyse, bir Order oluşturun ve iki satır yazdırın:
    • getInfo() yönteminin sonucu
    • getStatusValue() yönteminin sonucu
    Durum dizesi geçersizse, "Invalid status" yazdırın.

Bu zorluk, enum'ların nasıl tip güvenliği sağladığını gösterir — Order sınıfınız yalnızca geçerli durumları kabul edebilir ve tryFrom() yöntemi, geçersiz değer riski olmadan kullanıcı girdisini güvenli bir şekilde işlemenize olanak tanır.

Kopya kağıdı

Enum'lar, sabit bir değer kümesini tanımlamak için tip güvenli bir yol sağlar. enum anahtar kelimesini kullanarak bir enum tanımlayın:

<?php
enum Status {
    case Pending;
    case Active;
    case Completed;
}

$status = Status::Active;
echo $status->name; // Outputs: Active

Destekli enum'lar (Backed enums), her bir durumla dize veya tam sayı değerlerini ilişkilendirir:

<?php
enum Status: string {
    case Pending = 'pending';
    case Active = 'active';
    case Completed = 'completed';
}

$status = Status::Active;
echo $status->value; // Outputs: active

Bir değerden enum oluşturmak için from() metodunu veya geçersiz değerler için null döndüren tryFrom() metodunu kullanın:

<?php
$status = Status::from('active');      // Returns Status::Active
$invalid = Status::tryFrom('unknown'); // Returns null

Enum'lar, ilgili mantığı kapsüllemek için metodlar içerebilir:

<?php
enum Status: string {
    case Pending = 'pending';
    case Active = 'active';
    
    public function label(): string {
        return match($this) {
            self::Pending => 'Awaiting',
            self::Active => 'In Progress',
        };
    }
}

Kendin dene

<?php

require_once 'Order.php';

// Girdiyi oku
$orderId = trim(fgets(STDIN));
$statusString = trim(fgets(STDIN));

// TODO: Durum dizesini güvenli bir şekilde bir enum'a dönüştürmek için OrderStatus::tryFrom() kullanın
// tryFrom(), değer geçersizse null döndürür

// TODO: Durum geçerliyse, bir Order oluşturun ve şunları yazdırın:
// - getInfo() sonucu
// - getStatusValue() sonucu

// TODO: Durum geçersizse, "Invalid status" yazdırı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