PHP 8.1 aramıza katılan Enum nedir ve nasıl kullanılır?

PHP 23 May 2022

Özellikle model yapılarımızda bazı sabitler (const) tanımlarız ve bu sabitlere aktarılan değerlere göre işlem yaparız. Hızlıca bir örneğe göz atalım:

<?php

class Project
{
    const status_draft = 1; // proje taslaklarda
    const status_in_review = 2; // proje incelemede
    const status_revision = 3; // proje revizyonda
}

Daha sonra ilgili class akabinde ilgili sabiti çağırarak value'leri alır ve yapmamız gerekeni işlemi yerine getiririz ve bu sayede karmaşayı büyük ölçüde azaltırız. Ancak bunu yapmanın çok daha basit ve çok daha anlamlı bir yolu var desem?

PHP 8.1 Enum Nedir?

Enum'un Türkçe karşılığını "numaralandırma" olarak söyleyebiliriz. Tıpkı açtığımız normal class yapısı gibidir. Bu sefer "class Name" yerine "enum Name" olarak başlarız. Class yapısından farklı olarak, kendi içerisinde kullanabileceğiniz bazı fonksiyonlar ile hazır olarak gelir. Key'i verdikten sonra value'i almanın yanı sıra, tam tersi olarak önce value'yi verip akabinde key'i de alabilirsiniz. Hatta tek bir method yardımıyla enum dosyasına yazdığınız bütün enumları çekebilirsiniz.

PHP Enum Nasıl Kullanılır?

Örnek bir enum dosyası oluşturarak başlayalım. Bu sefer const yerine case tanımlıyoruz.

<?php

enum ProjectEnums: int
{
    case DRAFT = 1; // proje taslaklarda
    case REVIEW = 2; // proje incelemede
    case REVISION = 3; // proje revizyonda
}

İşin en iyi yanı şudur ki, ekstra methodlar tanımlayarak fazlaca özelleştirme yapabilir ve kullanım alanınızı rahatlatabilirsiniz. Yani şöyle düşünebilirsiniz; ProjectEnums::DRAFT çağırdığım zaman, bir method yardımıyla bunun gözüken adı "Taslak" olsun. Rengini çağırdığım zaman tanımladığım "#ff0000" şeklinde bir renk kodu dönsün. Hadi yapalım.

Bu işlemi yaparken PHP 8 ile aramıza katılan match yapısı kullanılmıştır. Match yapısının detayları için buraya tıklayarak diğer blog yazımı okuyabilirsiniz.
public function alias(): string
{
    return match ($this) {
        self::DRAFT => 'Taslak',
        self::REVIEW => 'İnceleme',
        self::REVISION => 'Revizyon'
    };
}


public function color(): string
{
    return match ($this) {
        self::DRAFT => '#ff0000',
        self::REVIEW => '#fff',
        self::REVISION => '#000',
    };
}

Şimdi ID'si 1 olan statusun adını ve rengini çekmeyi deneyelim.

 ProjectEnums::from(1)->color(); // Dönen değer "#ff0000"
 ProjectEnums::from(1)->alias(); // Dönen değer "Taslak"

 // Bütün değerleri görmek istersek:
 foreach(ProjectEnums::cases() as $case) {
	echo $case->alias(); // İsim olarak döndü
	echo $case->value; // Key'in valuesi olarak döndü
 }

/**
 * Taslak 1
 * İnceleme 2
 * Revizyon 3
 */
 
 // Direk case üzerinden erişmek:
 $status = ProjectEnums::DRAFT;
 $status->color(); // "#ff0000";
 $status->alias(); // "Taslak";
 $status->value; // 1
 
 // Veya
 ProjectEnums::DRAFT->color(); // "#ff0000";
 ProjectEnums::DRAFT->alias(); // "Taslak";
 ProjectEnums::DRAFT->value; // 1

Ayrıca olası hataların önüne geçmek için TryFrom anahtar kelimesini kullanabilirsiniz. Bu sayede bir exception fırlatmak yerine, null değer alırsınız. Ayrıca varlığı kontrol etmek için harika bir yöntemdir.

ProjectEnums::tryFrom(4); // return null

Etiketler