设置一个config PHP类来保持项目设置正确吗?

设置一个config PHP类来保持项目设置正确吗?,php,class,configuration,config-files,Php,Class,Configuration,Config Files,我想创建一个config.php文件,以保留通常在不同项目之间更改的各种配置值,并且我想定义一个类来保留此文件中的配置值,如下所示: class Config { const DB_SERVER = 'localhost', DB_NAME = 'abc', DB_USERNAME = 'admin', DB_PASSWORD = '12345', WEBSITE_NAME = 'My

我想创建一个config.php文件,以保留通常在不同项目之间更改的各种配置值,并且我想定义一个类来保留此文件中的配置值,如下所示:

class Config {
    const DB_SERVER    = 'localhost',
          DB_NAME      = 'abc',
          DB_USERNAME  = 'admin',
          DB_PASSWORD  = '12345',

          WEBSITE_NAME = 'My New Website',
          IMAGE_DIR    = 'img';
}
$connection = mysql_connect(Config::DB_SERVER, Config::DB_USERNAME, Config::DB_PASSWORD) or die("Database connection failed..");
以此类推,我想将所有值定义为类内的常量,我将按如下方式调用它们:

class Config {
    const DB_SERVER    = 'localhost',
          DB_NAME      = 'abc',
          DB_USERNAME  = 'admin',
          DB_PASSWORD  = '12345',

          WEBSITE_NAME = 'My New Website',
          IMAGE_DIR    = 'img';
}
$connection = mysql_connect(Config::DB_SERVER, Config::DB_USERNAME, Config::DB_PASSWORD) or die("Database connection failed..");

我想知道:这种设置项目配置的方式是否正确?这条路有什么缺点吗?如果这是错误的,那么最好的方法是什么呢?

我想,你想要的是

像那样。您可以使用
::
调用它们,例如
Config::$DB\u SERVER


顺便说一句,如果它们是类变量,通常你不会把它们写得那么大。“大”通常是指全球性的。

我发现这两篇文章谈论的是同一个主题,我发现它们非常有用,所以我想在这里分享它们:

1-
2-


我希望他们能像帮助我一样帮助我。

这是一种方法,是的。依我看,这是一个不错的方法。基本上,这个类变成了一个配置文件,只使用PHP语法

但也有一些缺点:

  • 不能有常量数组或对象。(当然,你也不能有全局常量数组/对象,所以…(从5.6开始,你可以有常量数组。但是仍然没有常量对象。我很确定你也不能有常量资源,因为这没有多大意义。)

    您可以通过为对象实现一个静态getter来解决这个问题(当然,它被编码为总是返回相同的对象)……但是我建议在大多数情况下不要使用它。只有当配置中的对象设计为不可变时,这才是一个安全的选项。(并非为不变性而设计的对象太容易更改,即使是意外更改。)

    (除了易变性问题,在配置文件中实际运行代码会让我感到不舒服……但这主要是个人偏好。)

  • 这个类的用途与其他类不同——它的目的是根据每个项目进行更改。您可以考虑将配置类保留在其他类之外,比如通常保存配置文件的地方。

  • 对于一个真正的配置文件,由于您在运行时对其进行解析,您可以处理丢失或无效的文件(例如,通过使用默认设置运行,使用可解析的部分,和/或显示有用的错误消息)。但是,一旦您的配置以PHP代码的形式运行,任何语法错误——或者,如果您没有解释,缺少的配置类——都将使应用程序停止运行。如果您在
    display\u errors
    关闭的情况下运行(建议在生产中使用),问题可能不太明显


如果我删除“const”一词而改为“static”,它们将不再是常量,将变成普通属性,在这种情况下,我不应该在它们前面加“$”吗?对,它们需要一个
$
。我真的以为你混淆了这两个关键词。如果您真的只需要常量行为,那么在PHP中不将其放入类中是正常的。如果您想调用它而不创建Config类的对象,那么您也需要
static
,顺便说一句。您可以使用final,rite?您还可以使用
define('DB_VAR','value')可以包含在脚本中的某种配置文件中。@mike是的,我知道,但我不想单独使用常量名称,我想在它前面使用任何表示它是配置值的单词,如“config”(类的名称),在本例中,在这种情况下,
定义('config_DB_VAR','value')这可能也很有趣:@Mike define('CONFIG_DB_VAR','value');这是一个好主意,我会考虑的,谢谢。请注意,由于PHP5.6,您可以使用常量数组!另一个缺点是可测试性。在单元测试期间,代码的任何静态部分都很难(或不可能)正确模拟。@David:与其他配置方法相比,配置类常量的可测试性并不是真正的缺点。自动加载可以使自定义配置类变得简单…只需在任何需要之前加载替换项,就可以了。问题在于,配置本身使单元测试复杂化,因为它本质上涉及单元间的关系。基本上,所有配置方案在误用时都存在相同的问题。如果可测试性是一个目标,那么你的应用程序的初始化代码(没有其他内容)应该读取配置设置,并将它们作为构造函数参数等打包到其他所有内容中。如果monkey patching是一种可行的方法,那么是的,静态依赖关系不是什么大问题。我更喜欢动态配置对象,它可以在不修改自动加载器的情况下进行模拟。第二个链接不再工作了