$ settings数组或Config类来存储项目设置?

时间:2010-07-17 07:40:25

标签: php oop class configuration

我应该如何存储项目设置?

哪个更好 - 在我的所有设置中使用$settings数组:

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

或创建一个单独的Config类,其中包含所有设置?

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

有什么好的例子吗?

7 个答案:

答案 0 :(得分:11)

我认为最好使用常量进行配置。例如,使用类常量:

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

echo Config::max_photos;

如果你有PHP 5.3,你也可以将它们定义为全局常量:

const MAX_PHOTOS = 30;

echo MAX_PHOTOS;

但我认为这远不那么干净和直截了当。

显然只要您只存储常量,即标量,非表达式值,这只会起作用。例如,如果您的配置包含数组,则此功能将不再起作用。在这种情况下,我将使用具有公共静态属性的Config类:

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

echo Config::$per_page;

后者与$config数组方法非常相似,但是有哪些好处(或者这可能是一个缺点?)可以从包括函数和类在内的所有地方访问该类,而该数组只能在除非使用global $config;将其导入函数/类中,否则为全局空间。

答案 1 :(得分:2)

要么你会感觉很舒服,要么做得最好。

答案 2 :(得分:1)

最好的方法是将您的设置存储在文件中。 并操纵此文件声明一个在文件上执行操作的类

答案 3 :(得分:1)

如果你采用数组方法,你可以使用数组文字来获得稍微更易读的代码:

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

答案 4 :(得分:1)

我的两分钱:同时使用两者。大多数应用程序配置设置属于全局数组变量。需要从不同的应用程序部分访问配置数据,这就是全局变量的用途。将所有内容保存在一个数组中是最明智的。阵列可以扩展,例如例如,在config.php中设置了一些选项,其余选项从config.ini中读取。

但是CONSTANTS也有一席之地。如果一个选项确实是应用程序运行时期间可能发生的变化,或者它更多是固定/魔术值,那么绘制的细线就是。如果设置一次,则不应更改应用程序设置(或渲染可能会失败),则此选项不应位于数组中,而应作为常量固定。 (这是一个解释性的经验法则,但很适合我。)

答案 5 :(得分:0)

如果项目设置太重,那么文件(xml更好)是好的,专用的设置类也很好。

如果项目设置很小,那么阵列最好,它非常快,不会出现与I / O相关的问题。

即使您可以使用数据库(较慢和身份验证问题)。

答案 6 :(得分: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;
}

请记住,此示例已被删除,以展示一个想法。