Enums sind Àhnlich wie Klassen und teilen sich die gleichen NamensrÀume wie Klassen, Schnittstellen und Traits. Sie können auch auf die gleiche Weise automatisch geladen werden. Eine Enum definiert einen neuen Typ, der eine feste, begrenzte Anzahl von möglichen zulÀssigen Werten hat.
<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
Diese Deklaration erzeugt einen neuen AufzÀhlungstyp namens
Suit, der genau vier zulÀssige Werte hat:
Suit::Hearts, Suit::Diamonds,
Suit::Clubs, und Suit::Spades.
Variablen kann einer dieser zulÀssigen Werte zugewiesen werden. Eine
Funktion kann gegen einen AufzĂ€hlungstyp typgeprĂŒft werden; in diesem Fall
dĂŒrfen nur Werte dieses Typs ĂŒbergeben werden.
<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
function pick_a_card(Suit $suit)
{
var_dump($suit);
}
$val = Suit::Diamonds;
// OK
pick_a_card($val);
// OK
pick_a_card(Suit::Clubs);
// TypeError: pick_a_card(): Argument #1 ($suit) must be of type Suit, string given
pick_a_card('Spades');
Eine AufzÀhlung kann null oder mehr case-Definitionen
haben, wobei es kein Maximum gibt. Eine AufzÀhlung mit null FÀllen ist
zwar syntaktisch gĂŒltig, aber ziemlich nutzlos.
FĂŒr AufzĂ€hlungsfĂ€lle gelten die gleichen Syntaxregeln wie fĂŒr jedes Label in PHP, siehe Konstanten.
StandardmĂ€Ăig werden FĂ€lle intern nicht mit einem skalaren Wert verknĂŒpft.
Das bedeutet, dass Suit::Hearts nicht gleich
"0" ist. Stattdessen wird jeder Fall mit einem
Singleton-Objekt mit diesem Namen verknĂŒpft. Der folgende Code
veranschaulicht dies:
<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
$a = Suit::Spades;
$b = Suit::Spades;
if ($a === $b) {
print "Suits match using ===\n";
}
if ($a instanceof Suit) {
print "Suits match using instanceof\n";
}
if ($a !== 'Spades') {
print "Suit does not match the string\n";
}
Es bedeutet auch, dass Enum-Werte niemals < oder
> sind, da diese Vergleiche bei Objekten keinen Sinn
ergeben. Wenn Enum-Werte auf diese Weise verglichen werden, wird immer
false zurĂŒckgegeben.
Eine solche Art von Fall, der keine zugehörigen Daten enthÀlt, wird als "Pure Case" (reiner Fall) bezeichnet. Eine Enum, die nur reine FÀlle enthÀlt, wird als "Pure Enum" bezeichnet.
Alle Pure Cases werden als Instanzen ihres Enum-Typs implementiert. Der Enum-Typ wird intern als Klasse dargestellt.
Alle FĂ€lle haben die schreibgeschĂŒtzte Eigenschaft
name, die den Namen des Falls selbst angibt, wobei
zwischen GroĂ- und Kleinschreibung unterschieden wird.
<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
print Suit::Spades->name;
// Gibt "Spades" ausWenn der Name eines Enum-Falls dynamisch ermittelt wird, ist es auch möglich, die Funktionen defined() und constant() zu verwenden, um zu prĂŒfen, ob es den Enum-Fall gibt, bzw. diesen auszulesen. Davon wird jedoch abgeraten, da die Verwendung von Wertgebundene AufzĂ€hlungen (Backed Enums) die meisten AnwendungsfĂ€lle abdecken sollte.