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 kullanmak anlamına geliyordu; her ikisi de hataya açık yaklaşımlardı. Enum'lar (numaralandırmalar), yalnızca belirli, önceden tanımlanmış değerleri barındırabilen bir tür tanımlamak için uygun bir yol sunar.

enum anahtar sözcüğünü 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 desteklenen değerlere de sahip olabilir - her bir durumla ilişkilendirilmiş dize veya tamsayı değerleri. Bu, enum'ları veritabanlarında veya API'lerde depolarken 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

Değer destekli enum'lar, değerinden bir enum oluşturmak için from() yöntemini ve geçersiz değerlerde hata fırlatmak yerine null döndüren tryFrom() yöntemini sağlar:

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

Enum'lar ayrıca yöntemler de içerebilir; bu da onları ilgili mantığı kapsüllemek için güçlü hâle getirir. Tür ipuçlarıyla sorunsuz bir şekilde çalışarak işlevlerinizin yalnızca geçerli değerleri kabul etmesini sağlarlar; artık bir dize değerinin beklenen seçeneklerle eşleşip eşleşmediğini sürekli kontrol etmeniz gerekmez.

challenge icon

Görev

Kolay

Sipariş durumlarını tür 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ı için uygun bir değere eşleyen, değer destekli bir enum oluşturacaksın.

Kodunu üç dosya arasında düzenleyeceksin:

  • OrderStatus.php: Dört duruma sahip, dize destekli OrderStatus adlı bir enum oluştur:
    • Pending, 'pending' ile desteklenir
    • Processing, 'processing' ile desteklenir
    • Shipped, 'shipped' ile desteklenir
    • Delivered, 'delivered' ile desteklenir
    Her durum için insanlar tarafından okunabilir bir açıklama döndüren label() metodunu ekle:
    • Pending, "Awaiting confirmation" döndürür
    • Processing, "Being prepared" döndürür
    • Shipped, "On the way" döndürür
    • Delivered, "Order complete" döndürür
  • Order.php: Enum'u kullanan bir Order sınıfı oluştur. OrderStatus dosyasını dahil et. Sınıf:
    • Yapıcıda, yapıcı terfi özelliğini kullanarak bir sipariş kimliğini (dize) ve bir OrderStatus kabul etmeli
    • getInfo() döndüren bir "Order [id]: [status label]" metoduna sahip olmalı
    • Durumun değer destekli değerini döndüren (veritabanında depolama için kullanışlı) bir getStatusValue() metoduna sahip olmalı
  • main.php: Order dosyasını dahil et. İki girdi alacaksın: bir sipariş kimliği ve bir durum dizesi (örneğin "shipped"). Dize girdisini güvenli bir şekilde bir tryFrom() enum'una dönüştürmek için OrderStatus kullan. Durum geçerliyse bir Order oluştur ve iki satır yazdır:
    • getInfo() sonucunu
    • getStatusValue() sonucunu
    Durum dizesi geçersizse "Invalid status" yazdır.

Bu meydan okuma, enum'ların tür güvenliğini nasıl sağladığını gösterir. Order sınıfın yalnızca geçerli durumları kabul edebilir ve tryFrom() metodu, geçersiz değerler riski oluşturmadan kullanıcı girdisini güvenli bir şekilde işlemene olanak tanır.

Kendin dene

<?php

require_once 'Order.php';

// Girişi 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 yazdırın:
// - getInfo() sonucu
// - getStatusValue() sonucu

// TODO: If the status is invalid, print "Invalid status"

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