Einer der Aspekte, der in einigen der anderen Antworten hier fehlt, ist eine Möglichkeit, Enums mit Type Hinting zu verwenden.
Wenn Sie Ihr Enum als eine Reihe von Konstanten in einer abstrakten Klasse definieren, z. B.
abstract class ShirtSize {
public const SMALL = 1;
public const MEDIUM = 2;
public const LARGE = 3;
}
nicht in einem Funktionsparameter angeben - zum einen, weil er nicht instanzierbar ist, aber auch, weil der Typ von ShirtSize::SMALL
es int
, nicht ShirtSize
.
Deshalb wären native Enums in PHP so viel besser als alles, was wir uns ausdenken können. Wir können uns jedoch einer Enum annähern, indem wir eine private Eigenschaft behalten, die den Wert der Enum repräsentiert, und dann die Initialisierung dieser Eigenschaft auf unsere vordefinierten Konstanten beschränken. Um zu verhindern, dass die Enum willkürlich instanziiert wird (ohne den Overhead der Typüberprüfung einer Whitelist), machen wir den Konstruktor privat.
class ShirtSize {
private $size;
private function __construct ($size) {
$this->size = $size;
}
public function equals (ShirtSize $s) {
return $this->size === $s->size;
}
public static function SMALL () { return new self(1); }
public static function MEDIUM () { return new self(2); }
public static function LARGE () { return new self(3); }
}
Dann können wir ShirtSize
wie diese:
function sizeIsAvailable ($productId, ShirtSize $size) {
// business magic
}
if(sizeIsAvailable($_GET["id"], ShirtSize::LARGE())) {
echo "Available";
} else {
echo "Out of stock.";
}
$s2 = ShirtSize::SMALL();
$s3 = ShirtSize::MEDIUM();
echo $s2->equals($s3) ? "SMALL == MEDIUM" : "SMALL != MEDIUM";
Auf diese Weise besteht der größte Unterschied aus Sicht des Benutzers darin, dass Sie eine ()
auf den Namen der Konstante.
Ein Nachteil ist jedoch, dass ===
(das die Objektgleichheit vergleicht) wird false zurückgeben, wenn ==
gibt true zurück. Aus diesem Grund ist es am besten, eine equals
Methode, so dass die Nutzer nicht daran denken müssen, die ==
und nicht ===
um zwei Enum-Werte zu vergleichen.
EDIT: Einige der vorhandenen Antworten sind sehr ähnlich, insbesondere: https://stackoverflow.com/a/25526473/2407870 .
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 .