Bir PHP enum'u (PHP 8.1+) sabit bir olası değerler kümesine, yani case'lerine sahip bir tür tanımlar: enum Status { case Active; case Banned; }. Bir case'i Status::Active olarak kullanırsınız ve Status türünde bir parametre başka hiçbir şeyi kabul etmez. Değerli (backed) bir enum, enum Status: string, ayrıca her case'e saklayabileceğiniz ve Status::from() ile geri çevirebileceğiniz bir değer verir.
Enum'lardan önce aynı şey bir dizge sabitleri listesiydi ve 'actve' gibi bir yazım hatasının veritabanına ulaşmasını hiçbir şey engellemiyordu. Parametre türü Status olduğunda yalnızca üç case verilebilir.
Saf enum'lar ve değerli enum'lar
Saf bir enum'un case'leri yalnızca adlardır. Değerli bir enum addan sonra bir tür, int veya string, bildirir ve her case o türden benzersiz bir değere sahip olmalıdır. Her case'in ->name özelliği vardır; yalnızca değerli case'lerin ->value özelliği vardır.
Değer programın dışına çıktığında değerli bir enum seçin: bir veritabanı sütunu, bir URL, bir form alanı, JSON. Bir ayrıştırıcının durumu gibi yalnızca kodun içinde var olan değerler için saf bir enum seçin.
from() ve tryFrom() ile bir değeri dönüştürme
Değerli enum'lar saklanan bir değeri geri bir case'e çevirmek için iki statik metot alır. from() bilinmeyen bir değer için bir ValueError fırlatır; tryFrom() null döndürür, bu da bir varsayılan için ?? ile iyi eşleşir:
Bir kullanıcının size gönderdiği her şeyde tryFrom(), bilinmeyen bir değerin duymak istediğiniz bir bug anlamına geldiği kendi kodunuzun yazdığı değerlerde from() kullanın. Argüman normal parametre türü kurallarına uyar: bir int enum'da varsayılan modda Priority::from('5') Priority::Normal döndürür, çünkü '5' önce 5 değerine çevrilir; Priority::from('5x') bir TypeError olur ve declare(strict_types=1) altında her dizge bir TypeError olur. Buna tryFrom() da dahildir: Priority::tryFrom('abc') null döndürmek yerine hata fırlatır, bu yüzden bir int enum için form girdisini önce filter_var($raw, FILTER_VALIDATE_INT) ile kontrol edin.
cases() ile tüm case'leri listeleme
Enum::cases() her case'ten oluşan bir diziyi tanımlandıkları sırayla döndürür. Bir açılır liste oluşturmanın, bir listeyi doğrulamanın veya array_column ile tüm değerleri almanın yolu budur:
Çalıştırın, bir plan seçin ve Choose düğmesine basın: aynı betik $_POST['plan'] doldurulmuş olarak yeniden çalışır ve tryFrom() gönderilen dizgeyi geri bir Plan case'ine çevirir. plan=gold gibi sahte bir değer null verir ve hiçbir seçenek seçili olmaz.
Enum metotları, sabitleri ve arayüzleri
Enum'ların metotları, statik metotları ve sabitleri olabilir ve arayüz uygulayabilirler. Bir metodun içinde $this mevcut case'tir; bu da match ($this) ifadesini her case'e veri eklemenin doğal yolu yapar. Bir enum'un sahip olamayacağı şey özelliklerdir: case başına veri metotlardan gelir.
match içinde enum'lar
match === ile karşılaştırır ve bir enum case'i yalnızca kendisiyle özdeştir, bu yüzden match ve enum'lar birbirine uyar. Bir case'i unutursanız ve o case match ifadesine ulaşırsa, PHP sessizce hiçbir şey döndürmek yerine bir UnhandledMatchError fırlatır:
match ifadesinin switch ile farkı için match sayfasına bakın.
JSON'da ve dizge olarak enum'lar
json_encode() değerli bir case'i değeri olarak yazar. Saf bir enum kodlanamaz ve herhangi bir case'i echo ile yazdırmak başarısız olur, çünkü bir enum bir dizge değil bir nesnedir. Bunun yerine ->value veya ->name yazdırın:
echo Role::Admin; bir Error fırlatır ("Object of class Role could not be converted to string") ve enum'lar __toString() uygulayamaz. Geri dönüşte JSON düz bir dizge verir, bu yüzden onu gösterildiği gibi from() veya tryFrom() ile dönüştürün. Kodlama hakkında daha fazlası json_encode sayfasında.
Sık yapılan enum hataları
Üç hata tekrar tekrar karşınıza çıkar. Bir case asla değerine eşit değildir, bir case dizi anahtarı olamaz ve new bir enum üzerinde çalışmaz:
Case'lerin kendileriyle anahtarlanmış bir eşlemeye ihtiyacınız varsa nesneleri anahtar olarak kabul eden SplObjectStorage veya WeakMap kullanın.
Sıkça Sorulan Sorular
PHP'de bir enum'un değerini nasıl alırım?
Değerli (backed) bir enum'da ->value okuyun: Status::Active->value 'active' olur. Her case'in ayrıca case adını dizge olarak veren ->name özelliği vardır ('Active'). Saf bir enum'un (: string veya : int olmayan) yalnızca ->name özelliği vardır.
PHP enum'larında from() ile tryFrom() arasındaki fark nedir?
İkisi de bir değeri değerli bir enum'un bir case'ine çevirir. Status::from('active') case'i döndürür ya da hiçbir case o değere sahip değilse bir ValueError fırlatır; Status::tryFrom('nope') ise bunun yerine null döndürür. Kullanıcı girdisi için tryFrom(), hatalı bir değer bir bug olduğunda from() kullanın.
PHP'de bir enum'un tüm değerlerini nasıl alırım?
Status::cases() her case'i tanımlanma sırasıyla döndürür. Değerli bir enum'un değerleri için array_column(Status::cases(), 'value'), adlar için array_column(Status::cases(), 'name') kullanın.
Saf enum ile değerli enum arasındaki fark nedir?
Saf bir enum'un (enum Suit { case Hearts; }) case'leri yalnızca adlardır. Değerli bir enum (enum Suit: string { case Hearts = 'H'; }) her case'e benzersiz bir int veya string değer verir; onu bir veritabanında saklamak, bir forma veya JSON'a koymak ve from() ya da tryFrom() ile geri çevirmek için buna ihtiyacınız vardır.
Bir PHP enum'unun metotları olabilir mi?
Evet. Enum'ların metotları, statik metotları ve sabitleri olabilir ve arayüz uygulayabilirler. Bir metodun içinde $this mevcut case'tir, bu yüzden return match ($this) { self::Active => 'green', self::Banned => 'red' }; yaygın bir kalıptır. Enum'ların özellikleri olamaz.