SORU
31 EKİM 2008, Cuma


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
31 EKİM 2008, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • gamingbits

    gamingbits

    2 Mayıs 2006
  • Kyletiv7

    Kyletiv7

    28 Mayıs 2007
  • Chaîne de TheMoustic

    Chaîne de T

    5 Kasım 2006