Die akzeptierte Antwort ist der richtige Weg, und das ist es auch, was ich der Einfachheit halber tue. Die meisten Vorteile der Aufzählung sind gegeben (lesbar, schnell, usw.). Ein Konzept fehlt jedoch: die Typsicherheit. In den meisten Sprachen werden Aufzählungen auch zur Einschränkung zulässiger Werte verwendet. Nachstehend ein Beispiel dafür, wie Typsicherheit auch durch die Verwendung privater Konstruktoren, statischer Instanziierungsmethoden und Typüberprüfung erreicht werden kann:
class DaysOfWeek{
const Sunday = 0;
const Monday = 1;
// etc.
private $intVal;
private function __construct($intVal){
$this->intVal = $intVal;
}
//static instantiation methods
public static function MONDAY(){
return new self(self::Monday);
}
//etc.
}
//function using type checking
function printDayOfWeek(DaysOfWeek $d){ //compiler can now use type checking
// to something with $d...
}
//calling the function is safe!
printDayOfWeek(DaysOfWeek::MONDAY());
Wir könnten sogar noch weiter gehen: Die Verwendung von Konstanten in der DaysOfWeek-Klasse könnte zu einer falschen Verwendung führen: z.B. könnte man sie fälschlicherweise so verwenden:
printDayOfWeek(DaysOfWeek::Monday); //triggers a compiler error.
was falsch ist (ruft ganzzahlige Konstante auf). Wir können dies verhindern, indem wir private statische Variablen anstelle von Konstanten verwenden:
class DaysOfWeeks{
private static $monday = 1;
//etc.
private $intVal;
//private constructor
private function __construct($intVal){
$this->intVal = $intVal;
}
//public instantiation methods
public static function MONDAY(){
return new self(self::$monday);
}
//etc.
//convert an instance to its integer value
public function intVal(){
return $this->intVal;
}
}
Natürlich ist es nicht möglich, auf Integer-Konstanten zuzugreifen (das war eigentlich der Zweck). Die intVal-Methode ermöglicht die Umwandlung eines DaysOfWeek-Objekts in seine Integer-Darstellung.
Wir könnten sogar noch weiter gehen, indem wir einen Zwischenspeichermechanismus in den Instanziierungsmethoden implementieren, um Speicher zu sparen, falls Aufzählungen ausgiebig genutzt werden...
Ich hoffe, das hilft
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 .