ПОДДРЖАНИENUMЕРАЦИИ
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
ПОДДРЖАНИENUMЕРАЦИИ
Референца за `language.enumerations.backed.php` со подобрена типографија и навигација.
ПОДДРЖАНИENUMЕРАЦИИ
Стандардно, Enumerated Cases немаат скаларен еквивалент. Тие се едноставно синглтон објекти. Сепак, постојат многу случаи каде што Enumerated Case треба да може да се врати во база на податоци или сличен систем за складирање, па затоа е корисно да се има вграден скаларен (и со тоа лесно серијализиран) еквивалент дефиниран интринзично.
За да дефинирате скаларен еквивалент за Enumeration, синтаксата е следна:
<?php
enum Suit: string
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}
?>Случај што има скаларен еквивалент се нарекува Backed Case, бидејќи е „Поддржан“ од поедноставна вредност. Enum што содржи сите Backed Cases се нарекува „Backed Enum“. Backed Enum може да содржи само Backed Cases. Pure Enum може да содржи само Pure Cases.
Backed Enum може да биде поддржан од типови на int or string, а дадена енумерација поддржува само еден тип во исто време (т.е., нема унија од int|string). Ако енумерацијата е означена како што има скаларен еквивалент, тогаш сите случаи мора да имаат уникатен скаларен еквивалент дефиниран експлицитно. Нема автоматски генерирани скаларни еквиваленти (на пр., последователни цели броеви). Backed случаите мора да бидат уникатни; два backed enum случаи не смеат да имаат ист скаларен еквивалент. Сепак, константа може да се однесува на случај, ефективно создавајќи алијас. Види КОНСТАНТИ НАENUMЕРАЦИЈА.
Еквивалентните вредности може да бидат константни скаларни изрази. Пред PHP 8.2.0, еквивалентните вредности мораа да бидат литерали или литерални изрази. Ова значи дека константите и константните изрази не беа поддржани. Тоа е, 1 + 1 беше дозволено, но 1 + SOME_CONST не беше.
Backed Cases имаат дополнително својство само за читање, value, што е вредноста наведена во дефиницијата.
<?php
print Suit::Clubs->value;
// Prints "C"
?>
За да се спроведе value својството како само за читање, на променлива не може да ѝ се додели референца. Тоа е, следново фрла грешка:
<?php
$suit = Suit::Clubs;
$ref = &$suit->value;
// Error: Cannot acquire reference to property Suit::$value
?>Backed enums имплементираат внатрешен BackedEnum интерфејс, кој открива два дополнителни методи:
-
from(int|string): selfќе земе скалар и ќе го врати соодветниот Enum Case. Ако не се најде, ќе фрли ValueError. Ова е главно корисно во случаи кога влезната скаларна вредност е доверлива и недостасува вредност на enum треба да се смета за грешка што го запира работењето на апликацијата. -
tryFrom(int|string): ?selfќе земе скалар и ќе го врати соодветниот Enum Case. Ако не се најде, ќе вратиnull. Ова е главно корисно во случаи кога влезната скаларна вредност не е доверлива и повикувачот сака да имплементира сопствено ракување со грешки или логика за вредност по дифолт.
На from() and tryFrom() методите ги следат стандардните правила за слабо/силно пишување. Во режим на слабо пишување, поминувањето на цел број или стринг е прифатливо и системот соодветно ќе ја присили вредноста. Поминувањето на float исто така ќе работи и ќе биде присилено. Во режим на строго пишување, поминувањето на цел број на from() на enum со подлога од стринг (или обратно) ќе резултира со TypeError, како и float во сите околности. Сите други типови на параметри ќе фрлат TypeError и во двата режима.
<?php
$record = get_stuff_from_database($id);
print $record['suit'];
$suit = Suit::from($record['suit']);
// Invalid data throws a ValueError: "X" is not a valid scalar value for enum "Suit"
print $suit->value;
$suit = Suit::tryFrom('A') ?? Suit::Spades;
// Invalid data returns null, so Suit::Spades is used instead.
print $suit->value;
?>Рачно дефинирање на from() or tryFrom() метод на Backed Enum ќе резултира со фатална грешка.