Öntanımlı olarak sayıl kılıfların sayıl bir karşılığı yoktur. Basitçe tekil nesnelerdir. Bununla birlikte, bir sayılama kılıfının bir veritabanına veya benzer bir veri deposuna giriş-çıkış yapabilmesini gerektiren çok sayıda durum vardır, dolayısıyla, dahili olarak tanımlanmış yerleşik bir sayıl (ve dolayısıyla dizgeleştirilebilir) eşdeğerin varlığı yararlıdır.
Bir sayılamaya sayıl bir eşdeğer tanımlama sözdizimi:
<?php
enum Deste: string
{
case Kupalar = 'Ku';
case Karolar = 'Ka';
case Sinekler = 'S';
case Maçalar = 'M';
}
?>
Basitçe bir değerle "desteklenmiş" olduğundan sayıl eşdeğeri olan kılıflara "Destekli Kılıf" denir. Yalnızca destekli kılıflar içeren sayılamalara "Destekli Sayılama" denir. Destekli bir sayılama sadece destekli kılıfları içerir, desteksiz kılıf içermez. Desteksiz bir sayılama ise sadece desteksiz kılıfları içerir, destekli kılıf içermez.
Destekli bir sayılama, int
veya
string
türünde bir değerle ama daima tek bir türdeki
değerlerle desteklenebilir (yani ya hepsi int
ya da
hepsi string
türünde olabilir). Bir sayılama sayıl
bir eşdeğere sahip olarak imlenmişse, tüm kılıflarına açıkça eşsiz birer
değer tanımlanmış olmalıdır. Sayıl eşdeğerler otomatik olarak
üretilmeyecektir (örneğin, sıralı tamsayılar). Destekli kılıflar diğer
kılıflar arasında eşsiz olmalı, aynı sayıl eşdeğere sahip birden fazla
kılıf olmamalıdır. Ancak, bir takma ad oluşturmak amacıyla bir sabite
atanabilir. Bkz: Sayılama Sabitleri.
Sayıl eşdeğerler sayılların kendileri olabileceği gibi sayıl ifadeleri de
olabilir. Sabitler ve sabit ifadeleri desteklenmez. Yani,
1 + 1
geçerli, fakat 1 + SOME_CONST
geçersizdir.
Destekli Kılıflar ayrıca salt-okunur özellikler olup,
value
tanımda belirtilen değerdir.
<?php
print Deste::Sinekler->value;
// Çıktısı: "S"
?>
value
özelliğin salt-okunurluğunu zorlamak amacıyla
bir değişkene gönderimli atanamaz. Yani, aşağıdaki örnek bir hata üretir:
<?php
$deste = Deste::Sinekler;
$ref = &$deste->value;
// hata: Deste::$value özelliğine gönderim sağlanamıyor
?>
Destekli sayılamalar dahili olarak iki ek yöntem sağlayan BackedEnum arayüzü ile gerçeklenir:
from(int|string): self
yöntemi bir sayıl değer alır ve
karşılığı olan sayılama kılıfını döndürür. Böyle bir kılıf yoksa
ValueError istisnası oluşur. Girdi olarak sayıl
değere güvenildiği ancak karşılığında bir sayılama değerinin
olmadığı durumda uygulamayı durduracak bir hata gerekiyorsa yararlı
olabilir.
tryFrom(int|string): ?self
yöntemi bir sayıl değer alır
ve karşılığı olan sayılama kılıfını döndürür. Böyle bir kılıf yoksa,
yönrem null
döndürür. Girdi olarak sayıl
değere güvenilmediği durumda geliştirici hatayı kendi ele almak isterse
veya bir öntanımlama yapmak isterse yararlı olabilir.
from()
ve tryFrom()
yöntemleri
standart gevşek/katı kodlama kurallarını izler. Gevşek kodlama kipinde, bir
tamsayı veya dizge aktarımı kabul edilebilir ve sistem değeri buna göre
zorlar. Bir gerçel sayı da çalışır ve bu da zorlanır. Katı kodlama kipinde,
bir dizge kılıf değeri durumunda from()
yöntemine bir
tamsayı (veya gerçel sayı) aktarımı (veya tersi)
TypeError istisnasına yol açar. Her iki kipte, tüm
diğer bağımsız değişken türleri TypeError istisnasına yol
açar.
<?php
$record = get_stuff_from_database($id);
print $record['deste'];
$deste = Deste::from($record['deste']);
// Geçersiz veri ValueError yavrulatır: "X" değeri enum "Deste" için geçerli bir sayıl değer değildir
print $deste->value;
$deste = Deste::tryFrom('A') ?? Deste::Sinekler;
// Geçersiz veri null döndürür, yerine Deste::Sinekler kullanılır.
print $deste->value;
?>
from()
veya tryFrom()
yöntemini
destekli bir sayılama üzerinde geliştirici kendi tanımlarsa sonuç
ölümcül hata olur.