设置一个配置 PHP 类来保留项目设置是不是正确?

Posted

技术标签:

【中文标题】设置一个配置 PHP 类来保留项目设置是不是正确?【英文标题】:Is it right to set a config PHP class to keep project settings?设置一个配置 PHP 类来保留项目设置是否正确? 【发布时间】:2012-06-14 19:21:33 【问题描述】:

我想创建一个 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..");

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

【问题讨论】:

您还可以在可以包含在脚本中的某种配置文件中使用define('DB_VAR', 'value'); @mike 是的,我知道,但我不想单独使用常量名称,我想在它之前使用任何表示它是配置值的词,例如“Config”(名称类)在这个例子中 在这种情况下,define('CONFIG_DB_VAR', 'value'); 这可能也很有趣:***.com/questions/1263954/… @Mike define('CONFIG_DB_VAR', 'value');是个好主意,我会考虑的,谢谢。 【参考方案1】:

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

不过有几个缺点:

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

您可以通过为对象实现一个静态 getter 来解决此问题(当然,它被编码为始终返回相同的对象)......但在大多数情况下我建议不要这样做。如果您的配置中的对象在设计上是不可变的,那么这只是一个安全的选择。 (不是为不变性而设计的对象太容易更改,即使是偶然的。)

(除了可变性问题,它让我在配置文件中有实际运行的代码很困扰......但这主要是个人喜好。)

这个类的目的与其他类不同——它旨在根据项目进行更改。您可能会考虑将 Config 类与其他类分开放置,例如您通常保存配置文件的位置。

1234563错误信息)。但是一旦你的配置作为 PHP 代码运行,任何语法错误——或者,如果你没有考虑到它,缺少的 Config 类——将会阻止应用程序死在它的轨道上。如果您在关闭display_errors 的情况下运行(建议在生产中使用),问题可能不太明显。

【讨论】:

请注意,从 PHP 5.6 开始,您可以在常量中包含数组! 另一个缺点是可测试性。在单元测试期间,代码的任何静态部分都很难(或不可能)正确模拟。 @David:与其他配置方法相比,可测试性并不是配置类常量的真正缺点。自动加载可以使自定义配置类变得容易......只需在任何需要它之前加载您的替换,然后就可以了。问题是配置本身使 unit 测试复杂化,因为它固有地涉及单元间的关系。基本上所有配置方案在误用时都会出现同样的问题。如果可测试性是一个目标,那么您的应用程序的初始化代码(仅此而已)应该读取配置设置并将它们作为构造函数参数等打包到其他所有内容中。 如果猴子补丁是一种可行的方法,那么是的,静态依赖关系不是什么大问题。我更喜欢动态配置对象,无需修改自动加载器即可模拟。【参考方案2】:

我发现了这 2 篇讨论相同主题的文章,我发现它们非常有用,所以我想在这里分享它们:

1- Using PHP classes to store configuration data2- Using a PHP Class to Store Configuration

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

【讨论】:

【参考方案3】:

我想,你想要的是static-keyword!

class Config 
    static $DB_SERVER    = 'localhost';
    static $DB_NAME      = 'abc';
    static $DB_USERNAME  = 'admin';
    static $DB_PASSWORD  = '12345';

    static $WEBSITE_NAME = 'My New Website';
    static $IMAGE_DIR    = 'img';

这样。您不能使用:: 给他们打电话,例如Config::$DB_SERVER.

顺便说一句。如果它们是类变量,通常你不会把它们写得那么大。 Big 通常意味着全局变量。

【讨论】:

如果我删除“const”这个词并改用“static”,它们将不再是常量,将变成普通属性,在这种情况下我不应该把“$”放在他们每个人的前面? 对,他们需要$。我真的以为你只是混淆了这两个关键字。如果你真的只是想要恒定的行为,那么在 PHP 中不把它放在一个类中是很正常的。如果您想在不创建 Config 类的对象的情况下调用它,那么您也需要 static,顺便说一句。 你可以使用最后的,仪式吗?

以上是关于设置一个配置 PHP 类来保留项目设置是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章

无论设置是不是正确,大文件上传时的 PHP 连接重置

我是不是正确使用 PHP 会话在表单之间保留数据? [复制]

php命令行工具检测php文件语法格式是不是正确的方法是

将项目中某些常用设置做成配置项

将项目中某些常用设置做成配置项

Tailwind css - “list-disc”没有正确设置 <li> 项目符号(双项目符号)