Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在内部表示配置选项的最佳方式是什么?_Php_Oop - Fatal编程技术网

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

Php 在内部表示配置选项的最佳方式是什么?,php,oop,Php,Oop,因此,我正在研究多种存储配置数据的方法。我相信我已经将范围缩小到3个方面: 只是一个简单的变量 $config = array( "database" => array( "host" => "localhost", "user" => "root", "pass" => "", "database" => "test" ) ); echo $config['database']['h

因此,我正在研究多种存储配置数据的方法。我相信我已经将范围缩小到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'];
这提供了最终的不变性,但也意味着每当我想要更改数据时,我都必须进入并手动编辑该类


您认为上面哪一项最适合存储配置选项?还是有更好的办法?

我会选择门后的第三种方式


它看起来比#2更容易阅读和理解,而且似乎比#1更能满足您的需要。

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


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

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

不过,实际上,“最好的”归根结底是关于什么是最容易和最一致的。如果你的应用程序的其余部分没有使用任何OO代码,那么你最好选择选项1。如果您最终想要编写一个完整的db抽象层,请选择#2

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

最好的方法是最适合你的应用程序

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

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

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


我同意第二种方法。另外,请看一下,因为它已经满足了您的所有需求,让我们从XML、Ini和普通数组初始化Config对象。

是的,我计划将数据存储在其他地方,我只是在寻找内部表示数据的最佳方法。现在,考虑到这个问题,这可能是一个更好的标题:)是的,一开始就有点倾向于这个选择。整个应用程序在OOP中大量编码,配置可能最终会动态形成,然后变得不可变。谢谢