PHP ve Numaralandırma
PHP yerel Numaralandırma yok biliyorum. Ama Java dünyadan onlara alışmak zorundayım. IDE önceden tanımlanmış değerler' otomatik tamamlama özellikleri anlayabilir. vermek için bir yol olarak çeteleler kullanmak isterim
Sabitler hile yapmak, ama ad çakışması sorunu var ve (ya aslındaçünküküresel ediyorlar. Diziler ad sorun yok, ama çok belirsiz, zamanında üzerine olabilir ve nadiren (hiç?) IDE onların anahtarları otomatik doldurma için biliyorum.
Geçici çözümler/herhangi bir çözüm sık kullandığınız var mı? Herkes PHP çocuklar çeteleler etrafında herhangi bir düşünce veya kararlar var olup olmadığını hatırlıyor mu?
CEVAP
Kullanımı üzerine davaya bağlı olarak, normalde bir şey kullanırdımbasitaşağıdaki gibi:
abstract class DaysOfWeek
{
const Sunday = 0;
const Monday = 1;
// etc.
}
$today = DaysOfWeek::Sunday;
Ancak, diğer durumlarda kullanmak sabitleri ve değerleri daha fazla doğrulama gerektirir. Yansıma altındaki yorumlara dayalı ve a few other notes, burada daha iyi durumda çok daha geniş bir yelpazede hizmet edebilir ki: genişletilmiş bir örnek
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) {
$values = array_values(self::getConstants());
return in_array($value, $values, $strict = true);
}
}
BasicEnum genişleten basit numaralama bir sınıf oluşturarak, sen şimdi böyle basit giriş doğrulama yöntemleri kullanma yeteneği var:
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
Bir yan not olarak, her zaman yansıma en az bir kere kullanıyorumverileri değiştirmez nereye statik/sabit bir sınıf(gibi bir numaralama), önbellek sonuçlar yansıma çağırır, yana kullanarak taze yansıma nesneler her zaman eninde sonunda bir fark performans etkisi (Saklı bir assocciative dizi için birden fazla çeteleler).
Çoğu insan artıknihayet5.3 ve SplEnum
kullanılabilir en azından yükseltilmiş, bu kesinlikle uygun bir seçenek de gerçek numaralama sahip geleneksel olarak sezgisel olmayan bir kavramı sakıncası süreceörneklemesisizin kod tabanı boyunca. Yukarıdaki örnekte, BasicEnum
DaysOfWeek
hiç başlatılamaz, ne de olmalıdır.
Orada önceden tanımlanmış bir numarala...
Numaralandırma adları staj Java?...
Nasıl bir tamsayı numaralandırma değer...
Numaralandırma uzatma yöntemleri...
Nasıl mysql sıralı numaralandırma boşl...