Dahili yapılandırma seçenekleri temsil etmek için en iyi yolu nedir?

4 Cevap php

Yani, benim yapılandırma verilerini saklamak için yollar bir dizi arıyorum. Ben 3 şekilde aşağı daralmış ettik inanıyorum:

Sadece basit bir değişken

$config = array(
    "database" => array(
        "host" => "localhost",
        "user" => "root",
        "pass" => "",
        "database" => "test"
    )
);

echo $config['database']['host'];

Bu yapılandırma seçenekleri değiştirilmesi mümkün olmamalıdır nereye kadar, sadece çok değişken olduğunu düşünüyorum.

Bir Modifiye Standart Sınıf

class stdDataClass {

    // Holds the Data in a Private Array, so it cannot be changed afterwards.
    private $data = array();

    public function __construct($data)
    {
        // ......
       $this->data = $data;
        // .....
    }

   // Returns the Requested Key
   public function __get($key)
   {
        return $this->data[$key];
   }

   // Throws an Error as you cannot change the data.
   public function __set($key, $value)
   {
         throw new Exception("Tried to Set Static Variable");
    }
}

$config = new stdStaticClass($config_options);
echo $config->database['host'];

Temelde, yaptığı her bir nesnenin içine yukarıdaki dizi kapsüller, ve nesne değiştirilemez emin kılar.

Ya da bir Statik Sınıfı

 class AppConfig{
    public static function getDatabaseInfo()
    {
          return array(
            "host" => "localhost",
            "user" => "root",
            "pass" => "",
            "database" => "test"
        );   
    }
    // .. etc ...
}

$config = AppConfig::getDatabaseInfo();
echo $config['host'];

Bu nihai değişmezliğini sağlar, ama aynı zamanda ben de gidip elle ben verileri değiştirmek istediği zaman sınıfını düzenlemek zorunda demektir.

Yukarıdaki hangi yapılandırma seçenekleri saklamak için iyi olacağını düşünüyorsunuz? Ya da daha iyi bir yolu var mı?

4 Cevap

Bu 3 seçenekten, statik bir yöntem muhtemelen en iyisidir.

Gerçekten de, "en iyi" kullanmak için en kolay ve en tutarlı ne hakkında sonuçta. App kalanı herhangi OO kod kullanılarak değilse o zaman sen de seçeneği # 1 ile gidebilir. Sonuçta bir bütün db soyutlama katmanı, seçenek # 2 yazmak isteyen varsa.

Hedeflerinizi ve bu tür iyi motorlu araç ne bir başkasına sorma gibi, gibi app kalanı görünüyor ne yaptığımız hakkında daha fazla şey bilmeden -, bu bir spor araba arıyorsanız bağlı olarak farklı bir cevap, bir kargo kamyon, ya da bir motosiklet.

Ben kapı # 3 arkasındaki whats ile gitmek istiyorum.

Bu okuma ve # 2 daha anlamak daha kolay görünüyor, ve # 1 daha da ihtiyaçlarını daha iyi karşılamak gibi görünüyor.

Ayrı bir dosyada yapılandırma veri depolamak fikirler için bu soruya bir göz atın:

http://stackoverflow.com/questions/2015715/fastest-way-to-store-easily-editable-config-data-in-php

Ben harici bir dosyadan bir dizi olarak yapılandırma veri çekme yöntemi, 2. kullanmak istiyorum.

best yolu uygulamalarınıza en uygun hangi olmasıdır.

Küçük bir uygulama için, hatta kesilebilir, bir dizi kullanmak için tamamen yeterli olabilir. Senden başka kimse bunu değiştirmek için varsa, o değişmez olmak zorunda değildir.

İkinci yaklaşım çok esnektir. Bu verileri saklar, ama bu konuda hiçbir şey bilmiyor. Sen özgürce dolaşması ve alıcı sınıfları ne gerek ondan alabilir. Bu yeniden yeterince geneldir ve somut uygulamaya çift yapılandırma sınıfı yok. Ayrıca yapılandırma gereklidir belirtmek için yöntem imzaları yazın ipuçları için izin vermek için bu veya benzer sınıflar ile bir arayüz kullanabilirsiniz. Sadece o stdDataClass isim, ama bu rolü var bunu isim yok: Yapılandırma.

Üçüncü çözüm çok somut olduğunu. Bu uygulama sınıfa gerektirir ve aynı zamanda alıcılar ve ayarlayıcıları sayesinde bu verileri bilmek ve sağlamak için o sınıfın sorumluluğunu kılan hakkında varsayımlar bir sürü hardcodes. Konfigürasyon gerektiren bileşenlerin miktarına bağlı olarak, belirli alıcılar bir sürü sonunda olabilir. Şansını sonraki uygulamayı farklı bileşenleri vardır çünkü, bir sonraki uygulama için tüm şey yeniden yazmak zorunda kalacak oldukça iyi.

Ben ikinci yaklaşımı ile gitmek istiyorum. Ayrıca, zaten tüm gereksinimlerini karşılayan olarak, Zend_Config bir göz var ve XML, Ini ve düz dizileri Yapılandırma nesnesi init edelim.