【问题标题】:How to create global configuration file?如何创建全局配置文件?
【发布时间】:2011-05-11 22:33:59
【问题描述】:

是否有可能使用在类中可见的全局变量创建配置文件?类似的东西:

config.php:

$config['host_address'] = 'localhost';
$config['username '] = 'root';
$config['password'] = 'root';
$config['name'] = 'data';

db.php:

include('config.php');
class DB
{
    private $_config = array($config['host_address'], $config['username'], $config['password'], $config['name']);
    ...

当前属性:

private $ _config = array();

我不想通过构造函数传输到我的 Singleton 数据库连接器:

DB::getInstance(array('localhost', 'root', 'root', 'data'));

【问题讨论】:

    标签: php mysql static configuration-files


    【解决方案1】:

    每个人都有自己的喜好。我更喜欢将我的数据库设置存储在 webroot 之外的 .ini 中,然后给它一个 0600 chmod 值,以防止除所有者之外的任何人阅读它。

    .ini 示例如下所示:

    [database]
    driver = mysql
    host = localhost
    ;port = 3306
    schema = yourdbname
    username = dbusername
    password = some_pass
    

    然后您可以使用 php 函数 parse_ini_file 然后在您的构造函数中将其读入并将其解析为数组:

    public function __construct($file = 'dbsettings.ini')
    {
        // @todo: change this path to be consistent with outside your webroot
        $file = '../' . $file;
    
        if (!$settings = parse_ini_file($file, TRUE)) throw new exception('Unable to open ' . $file . '.');
    
        $dns = $settings['database']['driver'] .
        ':host=' . $settings['database']['host'] .
        ((!empty($settings['database']['port'])) ? (';port=' . $settings['database']['port']) : '') .
        ';dbname=' . $settings['database']['schema'];
    
        // if not PDO, this part needs to be changed parent::__construct($dns, $settings['database']['username'], $settings['database']['password']);
    }
    

    还有 viola,您可以通过一种简单而安全的方式来设置数据库连接。此类取自 PDO 扩展类,因此如果您不使用 PDO,则需要更改该行,但您可以看到您在 $settings 数组中获取用户名等。

    我会极力避免将任何类型的数据库信息存储到CONSTANTGLOBAL 类型变量中。这样,$settings 仅可用于该类函数,而不能用于其他任何东西,从而提供了额外的安全层。

    【讨论】:

      【解决方案2】:

      您的问题是您试图在此处的类定义中使用 表达式

      class DB
      {
          private $_config = array($config['host_address'], ...
      

      这在语法上是不正确的(你只能使用 constant values),我不希望它在那里找到预期的范围。你应该做的是在构造函数中初始化这个属性:

      class DB
      {
          private $_config;
      
          function __construct() {
              global $config;
              $this->_config = array($config['host_address'], $config['username'], $config['password'], $config['name']);
          }
      

      甚至更懒惰,只需使用 include('config.php'); 代替 global $config 别名。这样,您的配置脚本将在构造函数中提取 $config 作为局部变量,这就是您所需要的。

      【讨论】:

        【解决方案3】:

        你可以试试定义:

        define('host_address', 'root');
        define('username', 'root');
        

        `用法:

        DB::getInstance(array(host_address, username, ...));
        

        【讨论】:

        • @Brad F Jacobs 这不是最好的选择,但我们并不都有将配置文件放在 webroot 之外的必要访问权限。
        • @Brad F Jacobs 作为例子证明或者它没有发生
        猜你喜欢
        • 1970-01-01
        • 2021-09-11
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-01
        • 2021-06-07
        相关资源
        最近更新 更多