Ich habe einige der anderen Antworten hier kommentiert, also dachte ich, ich würde mich auch einbringen. Da PHP keine typisierten Aufzählungen unterstützt, gibt es zwei Möglichkeiten: Entweder man hackt typisierte Aufzählungen, oder man lebt mit der Tatsache, dass es extrem schwierig ist, sie effektiv zu hacken.
Ich ziehe es vor, mit dieser Tatsache zu leben, und verwende stattdessen die const
Methode, die andere Antworten hier auf die eine oder andere Weise verwendet haben:
abstract class Enum
{
const NONE = null;
final private function __construct()
{
throw new NotSupportedException(); //
}
final private function __clone()
{
throw new NotSupportedException();
}
final public static function toArray()
{
return (new ReflectionClass(static::class))->getConstants();
}
final public static function isValid($value)
{
return in_array($value, static::toArray());
}
}
Ein Beispiel für eine Aufzählung:
final class ResponseStatusCode extends Enum
{
const OK = 200;
const CREATED = 201;
const ACCEPTED = 202;
// ...
const SERVICE_UNAVAILABLE = 503;
const GATEWAY_TIME_OUT = 504;
const HTTP_VERSION_NOT_SUPPORTED = 505;
}
Verwendung von Enum
als Basisklasse, von der alle anderen Aufzählungen abgeleitet werden, ermöglicht Hilfsmethoden, wie z. B. toArray
, isValid
, und so weiter. Für mich sind typisierte Aufzählungen ( und Verwaltung ihrer Instanzen ) werden einfach zu unordentlich.
Hypothetisch
Wenn gab es eine __getStatic
magische Methode ( _und vorzugsweise eine __equals
auch magische Methode_ ) könnte vieles davon durch eine Art Multiton-Muster abgemildert werden.
( Die folgenden Ausführungen sind hypothetisch; sie wird nicht Arbeit, aber vielleicht wird sie eines Tages )
final class TestEnum
{
private static $_values = [
'FOO' => 1,
'BAR' => 2,
'QUX' => 3,
];
private static $_instances = [];
public static function __getStatic($name)
{
if (isset(static::$_values[$name]))
{
if (empty(static::$_instances[$name]))
{
static::$_instances[$name] = new static($name);
}
return static::$_instances[$name];
}
throw new Exception(sprintf('Invalid enumeration value, "%s"', $name));
}
private $_value;
public function __construct($name)
{
$this->_value = static::$_values[$name];
}
public function __equals($object)
{
if ($object instanceof static)
{
return $object->_value === $this->_value;
}
return $object === $this->_value;
}
}
$foo = TestEnum::$FOO; // object(TestEnum)#1 (1) {
// ["_value":"TestEnum":private]=>
// int(1)
// }
$zap = TestEnum::$ZAP; // Uncaught exception 'Exception' with message
// 'Invalid enumeration member, "ZAP"'
$qux = TestEnum::$QUX;
TestEnum::$QUX == $qux; // true
'hello world!' == $qux; // false
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 .