Die grundlegende Syntax sieht wie folgt aus:
enum TransportMode {
case Bicycle;
case Car;
case Ship;
case Plane;
case Feet;
}
function travelCost(TransportMode $mode, int $distance): int
{ /* implementation */ }
$mode = TransportMode::Boat;
$bikeCost = travelCost(TransportMode::Bicycle, 90);
$boatCost = travelCost($mode, 90);
// this one would fail: (Enums are singletons, not scalars)
$failCost = travelCost('Car', 90);
Werte
Standardmäßig werden Aufzählungen nicht durch irgendeine Art von Skalar unterstützt. Daher TransportMode::Bicycle
ist nicht 0
und Sie können nicht vergleichen mit >
o <
zwischen den Aufzählungen.
Aber das Folgende funktioniert:
$foo = TransportMode::Car;
$bar = TransportMode::Car;
$baz = TransportMode::Bicycle;
$foo === $bar; // true
$bar === $baz; // false
$foo instanceof TransportMode; // true
$foo > $bar || $foo < $bar; // false either way
Gesicherte Aufzählungen
Sie können auch "unterstützte" Aufzählungen haben, bei denen jeder Aufzählungsfall entweder durch eine "unterstützte" int
oder eine string
.
enum Metal: int {
case Gold = 1932;
case Silver = 1049;
case Lead = 1134;
case Uranium = 1905;
case Copper = 894;
}
- Wenn ein Fall einen gesicherten Wert hat, müssen alle Fälle einen gesicherten Wert haben; es gibt keine automatisch generierten Werte.
- Beachten Sie, dass der Typ des rückgesicherten Wertes direkt nach dem Aufzählungsnamen angegeben wird
- Gesicherte Werte sind nur lesen
- Skalare Werte müssen sein einzigartig
- Die Werte müssen Literale oder wörtliche Ausdrücke sein.
- Um den gesicherten Wert zu lesen, greifen Sie auf die
value
Eigentum: Metal::Gold->value
.
Schließlich implementieren die unterstützten Aufzählungen eine BackedEnum
Schnittstelle, die zwei Methoden zur Verfügung stellt:
from(int|string): self
tryFrom(int|string): ?self
Sie sind fast gleichwertig, mit dem wichtigen Unterschied, dass die erste eine Ausnahme auslöst, wenn der Wert nicht gefunden wird, und die zweite gibt einfach null
.
// usage example:
$metal_1 = Metal::tryFrom(1932); // $metal_1 === Metal::Gold;
$metal_2 = Metal::tryFrom(1000); // $metal_2 === null;
$metal_3 = Metal::from(9999); // throws Exception
Methoden
Aufzählungen können Methoden haben und somit Schnittstellen implementieren.
interface TravelCapable
{
public function travelCost(int $distance): int;
public function requiresFuel(): bool;
}
enum TransportMode: int implements TravelCapable{
case Bicycle = 10;
case Car = 1000 ;
case Ship = 800 ;
case Plane = 2000;
case Feet = 5;
public function travelCost(int $distance): int
{
return $this->value * $distance;
}
public function requiresFuel(): bool {
return match($this) {
TransportMode::Car, TransportMode::Ship, TransportMode::Plane => true,
TransportMode::Bicycle, TransportMode::Feet => false
}
}
}
$mode = TransportMode::Car;
$carConsumesFuel = $mode->requiresFuel(); // true
$carTravelCost = $mode->travelCost(800); // 800000
Werteliste
Sowohl Pure Enums als auch Backed Enums implementieren intern die Schnittstelle UnitEnum
, die die (statische) Methode UnitEnum::cases()
und ermöglicht den Abruf eines Arrays der in der Aufzählung definierten Fälle:
$modes = TransportMode::cases();
Und jetzt $modes
ist:
[
TransportMode::Bicycle,
TransportMode::Car,
TransportMode::Ship,
TransportMode::Plane
TransportMode::Feet
]
Statische Methoden
Aufzählungen können ihre eigenen static
Methoden, die im Allgemeinen für spezialisierte Konstruktoren verwendet werden.
Damit sind die Grundlagen abgedeckt. Um alles zu erfahren, besuchen Sie bitte die entsprechender RFC bis die Funktion freigegeben und in der PHP-Dokumentation veröffentlicht wird.
0 Stimmen
it.toolbox.com/blogs/macsploitation/
1 Stimmen
Ich habe eine Umgehungsfunktion erstellt, die Konstanten als bitweise oder nicht aufzählt. Ich habe nicht bemerkt, dass Sie das vorher gefragt haben, aber ich habe hier eine bessere Lösung als Klassenvariablen: stackoverflow.com/questions/3836385/
0 Stimmen
github.com/myclabs/php-enum
0 Stimmen
Ich habe kürzlich eine einfache Bibliothek für PHP Enums entwickelt: github.com/dnl-blkv/simple-php-enum Zum Zeitpunkt des Verfassens dieser Antwort befindet es sich noch in der Vorveröffentlichungsphase, ist aber bereits voll funktionsfähig, gut dokumentiert und auf Packagist veröffentlicht. Dies könnte eine praktische Option sein, wenn Sie auf der Suche nach einfach zu implementierenden Enums ähnlich denen von C/C++ sind.
9 Stimmen
Die native Unterstützung von Aufzählungen in php wird mit der Version
8.1
wird voraussichtlich im November 2021 veröffentlicht werden. Es sieht wie folgt aus:enum Status { case started; case stopped; case paused; }
1 Stimmen
In der Tat ist die native Aufzählung jetzt mit der Veröffentlichung von PHP 8.1 möglich, Dokumentation .