2012-02-05 70 views
1

我經過一番輸入/指導..我有一個使用中央配置註冊表,如下所示的應用程序..配置註冊表 - 如何實現

應用解析爲INI文件config目錄,並設置陣列到使用文件的索引,以及在需要時單配置變量的名稱的類..

我可以看到所產生的,包括了幾個問題:文件之間

  1. 名稱衝突和VAR內設置劇本
  2. 無法拉動嵌套數組變量導致以下代碼:

    $ databases = config :: get('database'); $ actual_record = $ databases ['default'];

我很想爲嵌套值添加第二個get參數,但是如果我需要拉第三或第四級值,未來會發生什麼。

class config 
{ 
    private static $registry; 

    /** 
    * 
    */ 
    private function __construct() {} 

    /** 
    * 
    */ 
    public static function get($key) 
    { 
     if (isset(self::$registry[$key])) return self::$registry[$key]; 
     else return FALSE; 
    } 

    /** 
    * 
    */ 
    public static function set($key, $value, $overwrite = FALSE) 
    { 
     // Does the variable already exist? 
     if (isset(self::$registry[$key]) && $overwrite === FALSE) 
     throw new Exception(); 

     self::$registry[$key] = $value; 
    } 
} 

在此先感謝您的幫助..

+0

您可以將每個條目封裝到一個對象中,該對象具有用於再次檢索值的方法。 '配置:: getNested( '數據庫') - >獲取( '默認')'。或者,如果可能的話不嵌套它們呢?如何將它們與點分開? 'config :: get('database.default')' – Dan 2012-02-05 20:26:34

+0

這可能是個愚蠢的問題,但是如何將database.default表示法轉換爲數組調用? – Lee 2012-02-05 21:10:39

+0

標記標識符並將其分解爲點。如果你沒有一個點,這是一個普通的調用,否則,在第一個點後面的參數指定的字段名稱和第一個點後面的參數指定的字段等字段中的數組。如果你喜歡這個想法,我可以在答案中發佈一些代碼。 – Dan 2012-02-05 21:31:17

回答

1

如這裏的意見建議是代碼使點分隔名稱工作。可能會有更高效的解決方案,我只是把它們一起扔給你。

class Config 
{ 
    private 
     $registry 
    ; 

    public function __construct($registry) 
    { 
     $this->registry = $registry; 
    } 

    public function get($identifier) 
    { 
     return $this->resolve(explode('.', $identifier), $this->registry); 
    } 

    private function resolve($entries, $in) 
    { 
     if(key_exists($entries[0], $in) && count($entries) > 1) 
     { 
      // We have more than one level to resolve 
      $newIn = $in[$entries[0]]; 
      unset($entries[0]); 
      return $this->resolve(array_values($entries), $newIn); 
     } 
     elseif(key_exists($entries[0], $in) && count($entries) == 1) 
     { 
      // We are at the bottom, let's return. 
      return $in[$entries[0]]; 
     } 
     // If we get here something went wrong. 
     throw new Exception('Entry could not be resolved.'); 
    } 
} 

$cfg = new Config(
    array(
     'plain' => 'plain entry', 
     'nested' => array(
      'first' => 'nested, first entry', 
      'second' => array(
       'third' => 'deeper nested entry' 
      ) 
     ) 
    ) 
); 

print_r($cfg->get('plain'))."\n"; 
print_r($cfg->get('nested.first'))."\n"; 
print_r($cfg->get('nested.second.third'))."\n"; 
2

如果我理解正確的話,你可以,如果有上了一個檔次多個值再次加config一個新的實例。

這樣

value.second = a 
value.third = b 
other.value.my = a 
other.value.foo = b 

然後將導致類樹這樣的(config的結構始終是類的一個實例和intendation意味着東西高於config實例的屬性陣列中;文本在=>是索引名稱之前,您將訪問它們)。

config 
    value => config 
     second => a 
     third => b 
    other => config 
     value => config 
      my => a 
      foo => b 

我希望你能理解我的意思。

然後,你可以實現任何ArrayAccessmagic methods__get__set下列方法之一來訪問你的價值觀:

config->value->second 
config->other->value->my 

config['value']['second'] 
config['other']['value']['my']