PHP 8.1.9 Released!

Destekli Numaralandırmalar

Öntanımlı olarak numaralı kılıfların sayıl bir karşılığı yoktur. Basitçe tekil nesnelerdir. Bununla birlikte, bir numaralandırılmış kılıfı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 numaralandırmaya 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 numaralandırmalara "Destekli Numaralandırma" denir. Destekli bir numaralandırma sadece destekli kılıfları içerir, desteksiz kılıf içermez. Desteksiz bir numaralama ise sadece desteksiz kılıfları içerir, destekli kılıf içermez.

Destekli bir numaralandırma, 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 numaralandırma 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: Numaralandırma 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 numaralandırmalar 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 numaralandırma 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 numaralandırma 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 numaralandırma 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 değiştirge 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 numaralandırma üzerinde geliştirici kendi tanımlarsa sonuç ölümcül hata olur.

add a note

User Contributed Notes 1 note

up
2
ilovetobeanonymous at protonmail dot com
25 days ago
You want to add some constants in your Enum cases? You can use class constants !
Here's an example :
class Something
{
    const PARENT = 'parent';
}
enum MyEnum:string
{
    case firstChild = Something::PARENT . '_child1';
    case secondChild = Something::PARENT . '_child2';
   
}
echo MyEnum::firstChild->value; //print"parent_child1"
To Top