内部表示配置选项的最佳方式是什么?

4

所以,我正在考虑多种存储配置数据的方式。我相信已经将其缩小到了3种方式:

1.仅使用简单变量

$config = array(
    "database" => array(
        "host" => "localhost",
        "user" => "root",
        "pass" => "",
        "database" => "test"
    )
);

echo $config['database']['host'];

我认为这个太易变了,配置选项不应该被改变。
修改后的标准类。
class stdDataClass {

    // Holds the Data in a Private Array, so it cannot be changed afterwards.
    private $data = array();

    public function __construct($data)
    {
        // ......
       $this->data = $data;
        // .....
    }

   // Returns the Requested Key
   public function __get($key)
   {
        return $this->data[$key];
   }

   // Throws an Error as you cannot change the data.
   public function __set($key, $value)
   {
         throw new Exception("Tried to Set Static Variable");
    }
}

$config = new stdStaticClass($config_options);
echo $config->database['host'];

基本上,它所做的就是将上述数组封装到一个对象中,并确保该对象不能被更改。

或者是一个静态类

 class AppConfig{
    public static function getDatabaseInfo()
    {
          return array(
            "host" => "localhost",
            "user" => "root",
            "pass" => "",
            "database" => "test"
        );   
    }
    // .. etc ...
}

$config = AppConfig::getDatabaseInfo();
echo $config['host'];

这提供了终极不可变性,但这也意味着每当我想更改数据时,我都必须手动编辑类。

你认为上述哪种方式最适合存储配置选项?或者有更好的方法吗?

4个回答

3
在这三个选项中,静态方法可能是最好的选择。但是,“最好”的定义取决于哪种方法对您来说最容易和最一致。如果您的应用程序没有使用任何面向对象的代码,则可以选择选项#1。如果您最终想编写整个数据库抽象层,则使用选项#2。不知道您的目标和应用程序的其他方面是什么,就像询问某人最好的机动车是什么一样 - 这是因为不同的答案取决于您是否正在寻找跑车,货车还是摩托车。

是的,我一开始就倾向于选择这个选项。整个应用程序都是使用面向对象编程(OOP)进行编码的,配置应该最好以动态方式形成,然后变为不可变。谢谢! - Tyler Carter

1

我会选择第三个选项。

它看起来比第二个更易读和理解,并且似乎比第一个更符合您的需求。


1

是的,我计划将数据存储在其他地方,我只是在寻找最好的内部表示方法。现在想想,这可能是这个问题更好的标题 :) - Tyler Carter

1

最好的方式是选择最适合你的应用程序的方法。

对于一个小型应用程序,甚至使用可变数组完全足够。如果除了你之外没有其他人修改它,那它就不需要是不可变的。

第二种方法非常灵活。它封装了数据,但并不知道它的任何信息。你可以自由地传递它,并且消费类可以从中获取需要的内容。它足够通用以便于重复使用,并且不将配置类与具体应用程序耦合。您还可以使用此类或类似的接口来允许在方法签名中使用类型提示来指示需要 Config。只是不要将其命名为 stdDataClass,而是根据其角色命名为 Config。

你的第三种解决方案非常具体。它在类中硬编码了大量关于应用程序所需的假设,并且还使得提供此数据成为类的责任,通过 getter 和 setter 进行访问。根据需要进行配置的组件数量的多少,您可能会得到很多特定的 getters。很有可能你将不得不为下一个应用程序重新编写整个东西,因为你的下一个应用程序有不同的组件。

我会选择第二种方法。此外,看一下Zend_Config,因为它已经满足了你的所有要求,并且可以让你从XML、Ini和普通数组初始化Config对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接