Backade uppräkningar

Från Wiki.linux.se
Version från den 19 augusti 2024 kl. 17.14 av Admin (diskussion | bidrag)
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigering Hoppa till sök

Backade Enumerations

Som standard har Enumerated Cases ingen skalar motsvarighet. De är helt enkelt singleton-objekt. Det finns dock många fall där en Enumerated Case behöver kunna runda av till en databas eller liknande datalager, så att ha en inbyggd skalar (och därmed enkelt serialiserbar) motsvarighet definierad kan vara användbart.

För att definiera en skalar motsvarighet för en Enumeration, är syntaxen följande:

<?php

enum Suit: string
{
    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';
}
?>

En case som har en skalar motsvarighet kallas för en Backed Case, eftersom den är "Backad" av ett enklare värde. En Enum som innehåller alla Backed Cases kallas för en "Backed Enum." En Backed Enum kan endast innehålla Backed Cases. En Pure Enum kan endast innehålla Pure Cases.

En Backed Enum kan backas av typerna `int` eller `string`, och en given enumeration stöder endast en typ åt gången (dvs. ingen union av `int|string`). Om en enumeration är markerad som att den har en skalar motsvarighet, måste alla case ha en unik skalar motsvarighet definierad explicit. Det finns inga auto-genererade skalar motsvarigheter (t.ex. sekventiella heltal). Backed Cases måste vara unika; två Backed Enum Cases kan inte ha samma skalar motsvarighet. Dock kan en konstant hänvisa till en case, vilket effektivt skapar en alias. Se Enumeration constants.

Motsvarande värden måste vara litteraler eller litterala uttryck. Konstanter och konstanterade uttryck stöds inte. Det vill säga, `1 + 1` är tillåtet, men `1 + SOME_CONST` är det inte.

Backed Cases har en extra skrivskyddad egenskap, `value`, som är det värde som anges i definitionen.

<?php

print Suit::Clubs->value;
// Skriver ut "C"
?>

För att säkerställa att `value`-egenskapen är skrivskyddad kan en variabel inte tilldelas som en referens till den. Det vill säga, följande genererar ett fel:

<?php

$suit = Suit::Clubs;
$ref = &$suit->value;
// Fel: Kan inte hämta referens till egenskapen Suit::$value
?>

Backed Enums implementerar ett internt `BackedEnum`-gränssnitt, som exponerar två ytterligare metoder:

  • `from(int|string): self` kommer att ta en skalar och returnera motsvarande Enum Case. Om en inte hittas, kommer den att kasta ett `ValueError`. Detta är främst användbart i fall där den inmatade skalaren är pålitlig och ett saknat enum-värde bör betraktas som ett applikationsstoppande fel.
  • `tryFrom(int|string): ?self` kommer att ta en skalar och returnera motsvarande Enum Case. Om en inte hittas, kommer den att returnera `null`. Detta är främst användbart i fall där den inmatade skalaren är opålitlig och anroparen vill implementera sin egen felhantering eller standardvärdelogik.

Metoderna `from()` och `tryFrom()` följer standardreglerna för svag/stark typning. I svag typning är det acceptabelt att skicka ett heltal eller en sträng, och systemet kommer att tvinga värdet därefter. Att skicka ett flyttal fungerar också och kommer att tvingas. I strikt typning kommer det att resultera i ett `TypeError` om man skickar ett heltal till `from()` på en sträng-backad enum (eller vice versa), liksom ett flyttal under alla omständigheter. Alla andra parametertyper kommer att kasta ett `TypeError` i båda lägena.

<?php

$record = get_stuff_from_database($id);
print $record['suit'];

$suit = Suit::from($record['suit']);
// Ogiltiga data kastar ett ValueError: "X" är inte ett giltigt skalarvärde för enum "Suit"
print $suit->value;

$suit = Suit::tryFrom('A') ?? Suit::Spades;
// Ogiltiga data returnerar null, så Suit::Spades används istället.
print $suit->value;
?>

Att manuellt definiera en `from()` eller `tryFrom()`-metod på en Backed Enum resulterar i ett fatalt fel.


Sidslut

Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.enumerations.backed.php
PHP
Språkreferens
Språkreferens#Uppräkningar


Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/