PHP sınıfı sabitleri için tek harfli önek?

7 Cevap php

Biri ile birlikte çalışmak sınıf sabitler kümesini tanımlarken ben (tüm?) PHP sabitleri vb, E_NOTICE gibi, bir tek harf öneki var, T_STRING pek fark ettik başka, benzer uygulamayı takip etmek tercih edersiniz, yoksa daha ayrıntılı olmayı tercih edersiniz?

class Foo {
    // let's say 'I' means "input" veyasome other relevant word
    const I_STRING = 'string';
    const I_INTEGER = 'integer';
    const I_FLOAT = 'float';
}

veya

class Bar {
    const INPUT_STRING = 'string';
    const INPUT_INTEGER = 'integer';
    const INPUT_FLOAT = 'float';
}

7 Cevap

Kadar 5.3 PHP tek bir global ad sınırlıydı. Eğer sen, ucuza Namespacing - define ya da kendilerini bölümlemek için bir önek gerekli dilinde yerleşik ile beyan herhangi bir sabiti Anlamı.

Sabitleri kendileri hakkında: E_NOTICE ERROR_NOTICE eski kendini belgeleyen olmama önemli dezavantajı vardır yazmaktan daha kolay iken. Küresel bağlamda size öneki ile sabitler dışarı bölme gerekir yapmak değil sadece, bu önekleri de mümkün olduğunca açıklayıcı olmalıdır.

Eğer her zaman sınıf ismiyle bunları başvuran olacak gibi sınıf sabitleri, biraz daha farklı bir canavar vardır - bölümleme içeri inşa edilecek Yani Account::STATUS_CONFIRMED ve Account::STATUS_BANNED ile bitireceğiz. Ben birkaç düzine durumlarını olması planlanan ama eğer, ben, kendi sınıfında örneğin bu koymak istiyorum AccountStatus::CONFIRMED, AccountStatus::BANNED, vs

Eğer önemli hususlar bölümleme ve kendini belgeleyen adları (Seslendirme) sabitler için karar ne olursa olsun adlandırma kuralı.

Sabitleri gibi şeyler için ben ayrıntılı olmayı tercih ederim. Ben daha sonra (ya da yazmadım millet için) anlamak kod kolaylaştırır bulmak, ve ben bir IDE kullanmak beri, ben genellikle kodlama olduğumda bütün uzun adını yazarak konusunda endişelenmenize gerek yok.

Onların bağlamlarda son derece anlamlı olmadıkça bir sınıf içinde, sen de tüm önekleri kullanarak değil daha iyiyiz. Onlar tanıtıldı PHP'nin hiçbir ad alanları vardı çünkü sabitleri ile görmek mektup önek; ama sınıflar Namespacing çeşit vardır, bu nedenle bu gerçekten gerekli değildir.

Eğer, ancak, zaten bir önek kullanmak için gidiyor, ben size kullanmanızı öneririm tek, bunun yerine tek bir mektubun tam kelime en anlamlı. I I demekti kendimi tahmin olmazdı INPUT.

Çoğu PHP sabitleri önek sahip nedeni onları namespace olduğunu, böylece. Örneğin, E_USER_ERROR olarak, E_ iki şey yapar:

  1. Bu sürekli hata işleme sistemi ile ilgili olduğunu söyler
  2. O yapar sizin uygulamanızda USER_ERROR adında bir sabit olmasını istiyorsanız, böylece.

PHP5, biz sınıf sabitleri kullanabilirsiniz, böylece namespacing artık gerekli değildir. Bakınız örneğin DATE_ sabitleri DateTime tarihleri ​​ile ilgilenen PHP sınıfı olduğu . The equivalent of DATE_ATOM, DateTime::ATOM olduğunu. DATE_ATOM hala muhtemelen eski bir nedenle, var, ama sürekli bugün yaratılan, sadece DateTime::ATOM denilen olacağını idi.

Senin durumunda, bu sabitleri olurdu bir giriş sınıfı tanımlamak için mantıklı olabilir:

class input {
    public const STRING='string';
    public const INTEGER = 'integer';
    public const FLOAT = 'float';
}

C ve arkadaşlarının aksine, dinamik bir dilde nadiren, eğer hiç, önceden ilan sabitleri gerekir. tanımlayıcı dize değerleri gibi iyi çalışır çünkü. Kullanarak gerçek bir yararı yoktur

if($account->status == AccountStatus::CONFIRMED)

nazaran

if($account->is('confirmed'))

İkincisi daha okunabilir ve daha az kod gerektirir.

Bir öfkeli Yorumunuzu yazmaya başlamadan önce, jQuery bunu nasıl bakmak: http://api.jquery.com/animate/. 'Gizle', 'geçiş', 'hızlı' vs aslında sabittir, onlar sadece gibi beyan edilmez.

Ben daha ayrıntılı olması tercih

class Bar {
    const INPUT_STRING = 'string';
    const INPUT_INTEGER = 'integer';
    const INPUT_FLOAT = 'float';
}

Bu kod üzerinde çalışmak zorunda sonraki kişi için okunması kod kolaylaştırır. Bu kullanabilirsiniz olabilecek diğer bileşenleri ile bir çatışma sahip değişikliğini azaltmak gerekir: Siz sabitleri (XYZ_INPUT_STRING örneğin) kendi çerçeve-önek ekleyerek düşünebiliriz. Daha ayrıntılı olmanın bir dezavantajı variablenames uzun olsun eğiliminde olduğunu, ancak tüm değişken adını yazmak zorunda kalmamak için iyi bir IDE kod tamamlama destekler.

Prefixes ad semboller kullanılır. Örn. sabitleri Genel kapsamda bildirilen olduğundan, bunun bağlamını belirtmek ve farklı bir bağlamda sembolün diğer kullanımları ile çatışan önlemek için bir öneki kullanabilirsiniz.

Sınıf sabitleri zaten bir bağlam (sınıfı) var yana, daha da önek gerek yok gerçekten yoktur. Bunun yerine örneğin, bu muhtemelen daha mantıklı olur:

class Input {
  const STRING = 'string';
  const INTEGER = 'integer';
  const FLOAT = 'float';
}

O dedi, ben sabitleri (sınıf veya global), genellikle PHP çok kullandığınız bir şey değildir bulabilirsiniz. Genellikle daha özel bir methodName ile sürekli bir yerine, ve bu genellikle kod çok daha rahat hale. Örneğin, yerine böyle bir şey:

$foo->addParameter("foo", Input::STRING);

Bunu yapabilirdi:

$foo->addStringParameter("foo");

Bu and bunu yazmak daha kolay okumak daha kolay.