代码之家  ›  专栏  ›  技术社区  ›  Tyler Carter

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

  •  4
  • Tyler Carter  · 技术社区  · 15 年前

    因此,我正在研究一些存储配置数据的方法。我相信我已经把范围缩小到三个方面:

    只是一个简单的变量

    $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 回复  |  直到 15 年前
        1
  •  3
  •   gabrielk    15 年前

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

    实际上,“最好的”最终是关于什么是最容易使用和最一致的。如果应用程序的其余部分没有使用任何OO代码,那么您也可以使用选项1。如果您最终想要编写一个完整的DB抽象层,选项2。

    不知道你的目标是什么,不知道你的应用程序的其他部分是什么样子,这有点像问别人什么是最好的汽车——这是一个不同的答案,取决于你是在寻找一辆跑车,一辆货车,还是一辆摩托车。

        2
  •  1
  •   ChrisLively    15 年前

    我会带着门后的东西走。

    它看起来比2更容易阅读和理解,并且似乎比1更好地满足您的需求。

        3
  •  1
  •   Community CDub    8 年前

    查看这个问题,了解如何将配置数据存储在单独的文件中:

    Fastest way to store easily editable config data in PHP?

    我将使用方法2从外部文件中提取配置数据作为数组。

        4
  •  1
  •   Gordon Haim Evgi    15 年前

    这个 最好的 方法是最适合您的应用程序。

    对于一个小应用程序,使用数组可能完全足够,即使它是可变的。如果除了你没有人可以修改它,那么它不一定是不变的。

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

    第三种解决方案非常具体。它将许多关于应用程序需要什么的假设硬编码到类中,并使类有责任通过getter和setter了解和提供这些数据。根据需要配置的组件的数量,最终可能会得到许多特定的getter。很有可能你将不得不为你的下一个应用重写整个东西,因为你的下一个应用有不同的组件。

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

    推荐文章