: Kullanım durumunda bağlı olarak, normalde bir şey simple aşağıdaki gibi kullanabilirsiniz
abstract class DaysOfWeek
{
const Sunday = 0;
const Monday = 1;
// etc.
}
$today = DaysOfWeek::Sunday;
(Edit on 2013-12-12)
Ancak, diğer kullanım durumları sabitler ve değerlerin daha doğrulama gerekebilir. Yansıması, ve birkaç diğer notları hakkında aşağıda yorumlarına dayanarak, burada daha iyi durumlarda çok daha geniş bir yelpazede hizmet edebilir genişletilmiş bir örnek:
abstract class BasicEnum {
private static $constCache = NULL;
private static function getConstants() {
if (self::$constCache === NULL) {
$reflect = new ReflectionClass(get_called_class());
self::$constCache = $reflect->getConstants();
}
return self::$constCache;
}
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) {
$values = array_values(self::getConstants());
return in_array($value, $values, $strict = true);
}
}
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;
}
BasicEnum uzanan basit bir numaralama sınıf oluşturarak, artık basit giriş doğrulaması için bu suretle yöntemleri kullanmak için yeteneği var:
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
Taze yansıma kullanarak nesneleri beri bir yan not olarak, ben on a static/const class where the data won't change (böyle bir enum gibi) en az bir kez yansıması kullanmak her zaman, ben her zaman sonunda farkedilir bir performans olacak, bu yansıma aramaların sonuçlarını önbelleğe etkisi.
Şimdi çoğu kişi finally en az 5.3 yükseltilmiş, ve SplEnum
mevcut olması, bu da kesinlikle uygulanabilir bir seçenektir - sürece geleneksel unintuitive sakıncası yok gibi senin kod tabanı boyunca gerçek enum instantiations sahip kavramı. Yukarıdaki örnekte, BasicEnum
ve DaysOfWeek
tüm örneği değildir, ne de olmalıdır.