2010-07-17 70 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; 
} 

请记住这个例子剥离下来展示一个想法。