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

时间:2010-01-10 04:54:10

标签: php oop

所以,我正在研究存储配置数据的多种方法。我相信我已经把它缩小到3种方式:

只是一个简单的变量

$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 个答案:

答案 0 :(得分:3)

在这3个选项中,静态方法可能是最好的。

但是,真的,“最好的”最终是关于什么是最容易和最一致的使用。如果你的应用程序的其余部分没有使用任何OO代码,那么你也可以使用选项#1。如果您最终想要编写整个数据库抽象层,请选择#2。

如果不了解您的目标是什么以及您的应用程序的其余部分是什么样的,那就像问某人最好的机动车是什么 - 这取决于您是否正在寻找体育运动,这是一个不同的答案汽车,货运卡车或摩托车。

答案 1 :(得分:1)

我会在3号门后面看看。

阅读和理解比#2更容易,并且似乎比#1更能满足您的需求。

答案 2 :(得分:1)

请查看此问题,了解有关将配置数据存储在单独文件中的建议:

Fastest way to store easily editable config data in PHP?

我使用方法#2将配置数据作为外部文件中的数组拉出来。

答案 3 :(得分:1)

最佳方式最适合您的应用。

对于小型应用程序,使用数组可能就足够了,即使它是可变的。如果除了你之外没有人可以修改它,它不一定是不可变的。

第二种方法非常灵活。它封装了数据,但对此却一无所知。你可以自由地传递它,消费类可以从中获取它们所需要的东西。它足够通用,可以重用,并且不会将配置类与具体应用程序耦合。您还可以使用具有此类或类似类的接口,以允许方法签名中的类型提示指示需要Config。只是不要将它命名为stdDataClass,而是通过它的角色命名:Config。

你的第三个解决方案非常具体。它将关于您的应用程序所需内容的许多假设硬编码到类中,并且还使类通过getter和setter来了解和提供此数据。根据需要配置的组件数量,最终可能会有很多特定的getter。机会非常好你必须为你的下一个应用重写整个事情,因为你的下一个应用程序有不同的组件。

我会采用第二种方法。另外,看看Zend_Config,因为它已满足您的所有要求,让您从XML,Ini和普通数组中初始化Config对象。