En fonction du cas d'utilisation, j'utiliserais normalement quelque chose comme simple comme les suivantes :
abstract class DaysOfWeek
{
const Sunday = 0;
const Monday = 1;
// etc.
}
$today = DaysOfWeek::Sunday;
Cependant, d'autres cas d'utilisation peuvent nécessiter une plus grande validation des constantes et des valeurs. D'après les commentaires ci-dessous sur la réflexion quelques autres notes Dans ce contexte, voici un exemple élargi qui pourrait mieux convenir à un éventail beaucoup plus large de cas :
abstract class BasicEnum {
private static $constCacheArray = NULL;
private static function getConstants() {
if (self::$constCacheArray == NULL) {
self::$constCacheArray = [];
}
$calledClass = get_called_class();
if (!array_key_exists($calledClass, self::$constCacheArray)) {
$reflect = new ReflectionClass($calledClass);
self::$constCacheArray[$calledClass] = $reflect->getConstants();
}
return self::$constCacheArray[$calledClass];
}
public static function isValidName($name, $strict = false) {
$constants = self::getConstants();
if ($strict) {
return array_key_exists($name, $constants);
}
$keys = array_map('strtolower', array_keys($constants));
return in_array(strtolower($name), $keys);
}
public static function isValidValue($value, $strict = true) {
$values = array_values(self::getConstants());
return in_array($value, $values, $strict);
}
}
En créant une simple classe d'enum qui étend BasicEnum, vous avez maintenant la possibilité d'utiliser les méthodes ainsi pour une simple validation des entrées :
abstract class DaysOfWeek extends BasicEnum {
const Sunday = 0;
const Monday = 1;
const Tuesday = 2;
const Wednesday = 3;
const Thursday = 4;
const Friday = 5;
const Saturday = 6;
}
DaysOfWeek::isValidName('Humpday'); // false
DaysOfWeek::isValidName('Monday'); // true
DaysOfWeek::isValidName('monday'); // true
DaysOfWeek::isValidName('monday', $strict = true); // false
DaysOfWeek::isValidName(0); // false
DaysOfWeek::isValidValue(0); // true
DaysOfWeek::isValidValue(5); // true
DaysOfWeek::isValidValue(7); // false
DaysOfWeek::isValidValue('Friday'); // false
D'ailleurs, chaque fois que j'utilise la réflexion au moins une fois. sur une classe statique/const où les données ne changeront pas. (comme dans une énumération), je mets en cache les résultats de ces appels de réflexion, car l'utilisation de nouveaux objets de réflexion à chaque fois aura éventuellement un impact notable sur les performances (stocké dans un tableau assocciatif pour les énumérations multiples).
Maintenant que la plupart des gens ont enfin mis à jour vers au moins 5.3, et SplEnum
est disponible, c'est certainement une option viable aussi - tant que vous n'êtes pas gêné par la notion traditionnellement peu intuitive d'avoir un enum réel. instanciations dans l'ensemble de votre base de code. Dans l'exemple ci-dessus, BasicEnum
y DaysOfWeek
ne peuvent pas être instanciés du tout, et ne devraient pas l'être.
0 votes
it.toolbox.com/blogs/macsploitation/
1 votes
J'ai créé une fonction de contournement qui énumère les constantes comme bitwise ou non. Je n'ai pas remarqué que vous aviez déjà posé cette question, mais j'ai une meilleure solution que les variables de classe ici : stackoverflow.com/questions/3836385/
0 votes
github.com/myclabs/php-enum
9 votes
Le support natif des énumérations en php sera disponible avec la version
8.1
dont la sortie est prévue en novembre 2021. Il ressemble à ce qui suit :enum Status { case started; case stopped; case paused; }