将配置变量放入php 5中的类的最佳方法是什么?

时间:2008-12-02 00:48:17

标签: php oop

这是我的DB课程。我是OO的新手,已经有一段时间了,所以我还是有点模糊。

我的第一个想法是使用了一堆setter函数/方法..但是在编写了一大堆之后,我想到了使用PHP的define函数,就像这样。

define('MYSQL_USERNAME', 'jimbo');

这是一种公认​​的做法吗?什么是最佳做法?我是否真的会用一堆setter函数来混乱我的类(我目前是唯一使用这些类的开发人员)。你有什么解决方案?

谢谢!

3 个答案:

答案 0 :(得分:2)

可能有一些方法可以解决这个问题:

  1. 只需使用setter,它是完全可以接受的,但可以通过大量的配置选项获得一些“罗嗦”。

  2. 使用配置对象传入:

    $config = (object) array(
       'prop1' => 'somevalue',
       'prop2' => 'somevalue2',
       'prop3' => 'somevalue3',
    );
    
    $db = new DB($config);
    
  3. 如果你想使用常量,可以将它们限制在类中以避免全局命名空间污染:

    class DB {
        const USER = 'mysqluser';
    }
    
    echo DB::USER; // for example
    

答案 1 :(得分:2)

我仅使用const为类中的不可变常量创建助记符名称。 define()函数不会将常量作为类的一部分创建,它会在全局空间中创建常量。

class MyClass
{
  const CONFIG_FILE = 'myapp.ini';

类配置数据我通常在类中声明为protected哈希数组。键对于助记符很有用。值是默认值。

  protected $config = array(
    'logfile' => 'err.out',
    'debug' => false
  );

然后我使用parse_ini_file()加载“ini”格式文件,并使用array_merge()将密钥映射到类配置数组中:

  public function __construct() {
    $ini_data = parse_ini_file(self::CONFIG_FILE, __CLASS__);
    $this->config = array_merge($this->config, $ini_data);
  }

}

答案 2 :(得分:0)

我在两个方面取得了很大的成功:

  1. 正如@Owen建议的那样,使用类常量

    class Config {
        const PASSWORD_LENGTH = 12;
        const SEND_PASSWORD_EMAILS = true;
        // ...
    }
    
  2. 对于简单的配置变量(即没有数组等),作曲家可用的包vlucas/phpdotenv做得很好。文件.env包含您的所有配置:

    PASSWORD_LENGTH=12
    SEND_PASSWORD_EMAILS=1
    
  3. 然后可以通过getenv()$_ENV超级全球版提供。

        Dotenv::load(__DIR__);
        $passwordLength = $_ENV['PASSWORD_LENGTH']