2010-07-17 32 views
8

我應該如何存儲項目設置?

哪個更好 - 使用$settings陣列用我所有的設置:

$settings['max_photos'] = 30; 
//... 

,或者創建一個單獨Config類中的所有設置?

Class Config { 
    private $max_photos = 30; 
    //... 
} 

任何很好的例子?

回答

1

最好的方法是將您的設置存儲在文件中。 ,並操縱這個文件聲明一個類操作文件

0

如果項目設置太重,那麼文件(XML更好)是好的,一個專門的設置類也是好的。

如果項目設置很小,那麼陣列是最好的,它的速度非常快,並且不會出現與I/O相關的問題。

即使您可以使用數據庫(較慢和授權問題)。

2

兩者都可以很好地工作,無論您感覺最舒服。

11

我認爲最好使用常量進行配置。例如使用類常量:

class Config { 
    const 
    max_photos  = 30, 
    something_else = 100, 
    // ... 
    ; 
} 

echo Config::max_photos; 

如果你有PHP 5.3,你也可以將它們定義爲全局常量:

const MAX_PHOTOS = 30; 

echo MAX_PHOTOS; 

但我認爲這是遠不如簡潔明瞭。

很明顯,只要你只存儲常量,即標量的非表達式值,它就會起作用。例如,如果你的配置包含數組,這將不再有效。在這種情況下,我會用一個配置類的公共靜態屬性:

class Config { 
    public static $per_page = 30; 
    public static $array = array(...); 
} 

echo Config::$per_page; 

後者非常相似$config陣列的方法,但有益處(或可這是一個缺點?)這個類是訪問從包括函數和類在內的任何地方開始,而只有在全局空間中才能訪問數組,除非使用global $config;將它導入到函數/類中。

+1

+1常量爲常數值,那麼你可以放心,他們總是設置,不變和持久; fwiw靜態類變量帶有性能優勢,可以在運行時更改。最後,有人建議配置ini或xml文件 - 簡單的回答是,爲什麼浪費時間並添加不需要的額外負載(解析讀取等)。 – nathan 2010-07-17 09:44:28

+0

感謝,是的,我有數組太: $設置[ '語言'] =陣列( '工程'=> '英語', 'RUS'=> 'по-русски', '緯度'= >'Latviski' ); $ settings ['site_title'] = _(「網站標題」); $ settings ['default_lng'] ='eng'; /** *Мин。 количествогололов */ $ settings ['min_votes'] = 3; /** *Кол-воппльзователей,послекоторогорегистрациятолькопоприглашениям。 */ $ settings ['invites'] = 100000; // 25000; /** *請參考我們的隱私政策 */ $ settings ['invite_timeout'] = 86400 * 3; 我想,這個變種更好,謝謝大家的幫助! – ideea 2010-07-17 13:27:09

1

如果你去的陣列的方法,你可以使用數組文本略多可讀的代碼:

$settings = array(
    'max_photos' => 30, 
    'max_width' => 100 
    //... 
) 
1

我的兩分錢:同時使用。大多數應用程序配置設置屬於全局數組變量。配置數據需要從不同的應用程序部分訪問,這是全局變量的用途。把所有東西放在一起是最明智的。陣列可以擴展,例如,一些選項在config.php中設置,其餘選項例如從config.ini中讀取。

但也有一個CONSTANTS的地方。要畫出的細節是,如果某個選項在應用程序運行時期間真的可能會發生變化,或者它是更多的固定/魔術值。如果一旦設置完成,您不應該更改應用程序設置(或渲染可能會失敗),那麼此選項不應該在數組中,而是按照常量固定地修復。 (這是一個解釋性的經驗法則,但對我很有幫助。)

0

我傾向於將配置值全局訪問到配置數組中,並定義可在任何地方訪問的值。例如:

INC/config.php文件

// only accessed in global scope (see init.php) 
$config['error_reporting'] = E_ALL & ~E_NOTICE; 
$config['memory_limit'] = '16M'; 
$config['time_zone'] = 'America/Los_Angeles'; 

// accessed within functions or class methods (see somefile.php) 
define('HTTP', 'http://imac.local/my_site/'); 
define('HTTPS', 'http://imac.local/my_site/'); 
define('FILE_ROOT', '/Library/WebServer/Documents/my_site/'); 

INC /的init.php

require 'inc/config.php'; 

/* Set some php configurations */ 
isset($config['error_reporting']) ? error_reporting($config['error_reporting']) : ''; 
isset($config['time_limit']) ? set_time_limit($config['time_limit']) : ''; 
isset($config['memory_limit']) ? ini_set('memory_limit', $config['memory_limit']) : ''; 
isset($config['timezone']) ? date_default_timezone_set($config['timezone']) : date_default_timezone_set('America/Los_Angeles'); 

somefile.php

require 'inc/init.php'; 

function site_url($uri, $secure = FALSE) 
{ 
    return $secure ? HTTPS . $uri : HTTP . $uri; 
} 

請記住這個例子剝離下來展示一個想法。