在哪里放置框架的“设置”

时间:2011-03-20 16:50:53

标签: php frameworks programming-languages specifications

这是一个概念性问题。考虑一下你有一个运行通用网站的php框架。

您当然可以通过设置调整框架行为,问题是:放置这些设置的位置更自然?

我的框架包含一些帮助我完成某些任务的功能(例如缓存管理)。

在这个fw中,我使用了通用变量

$config = array( 'setting1'=>'value1' etc );

如果某个功能需要,它会执行global

function manageCache() {
    global $config;

    //> perform task with settings from $config
}

考虑我的框架的程序性质,以及有人说global is evil的事实,您将如何管理设置?

由于

Edit1:请不要告诉使用constats,我有大量的设置,我不想制作大量的常数+它们必须是可编辑的

5 个答案:

答案 0 :(得分:0)

如果您的设置不变且未更改,请考虑使用define() - http://php.net/manual/en/function.define.php

//Set anywhere like this
define("DB_NAME", "stackoverflow");

// You can then read it from anywhere using 
echo DB_NAME;

它们是否需要可编辑,然后您可以使用globals,但请确保register_globals已关闭。

如果您使用的是PHP5,那么您可以实现Registry pattern来执行此操作。

答案 1 :(得分:0)

我很想使用define而不是变量,因为这至少会消除对全局变量的需求。

也就是说,你不能(轻松地)通过定义来存储复杂数据类型,例如数组,因此你需要将其考虑在内。

答案 2 :(得分:0)

将全局作为函数参数传递

manageCache($config);

全球真的很邪恶

答案 3 :(得分:0)

通常,您的框架中的某个配置文件夹会在启动时自动包含。

它可能看起来像这样:

ROOT/
  config/
    db.php
    cache.php
    constants.php

然后你会有类似Config类的东西来处理导入这个配置变量并将它们转换成实例变量。这样您就可以像这样访问这些配置变量:

$config->get_config('settings_1');

答案 4 :(得分:0)

您的配置阵列没有任何问题。这是一种非常常见的方法。谬误globals are evil是货物崇拜节目的建议。请忽略。

现在$config数组通常很容易使用。但你可以扩展它。例如,初始化后将其转换为ArrayObject非常简单:

$config = new ArrayObject($config, 2);

这样您就可以访问$config["setting"]$config->setting等设置。它的眼睛更容易。

如果你还想避免在任何地方导入数组,因为你有时只需要一个值,那么为方便起见,使用包装函数config("setting")进行扩展。

顺便说一句,我自己经常使用配置数组和常量的混合。我在中心config.php中为插件和设置数组创建了一个小管理工具。 http://web135.srv3.sysproserver.de/milki.erphesfurt.de./genericplugins/genconfig.html