代码之家  ›  专栏  ›  技术社区  ›  alex

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

  •  1
  • alex  · 技术社区  · 16 年前

    这是我的DB类。我是OO的新手,做了一段时间的程序性工作,所以我仍然有点模糊。

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

    define('MYSQL_USERNAME', 'jimbo');
    

    这是公认的做法吗?最佳实践是什么?我真的应该用一堆setter函数来弄乱我的类吗(我目前是唯一使用这些类的开发人员)。你的解决方案是什么?

    非常感谢。

    3 回复  |  直到 12 年前
        1
  •  2
  •   Bill Karwin    16 年前

    我用 const 仅用于为类中的不可变常量创建助记符名称。这个 define() 函数不在类中创建常量,而是在全局空间中创建常量。

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

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

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

    然后,我加载一个“ini”格式的文件 parse_ini_file() 和使用 array_merge() 将键映射到类配置数组中:

      public function __construct() {
        $ini_data = parse_ini_file(self::CONFIG_FILE, __CLASS__);
        $this->config = array_merge($this->config, $ini_data);
      }
    
    }
    
        2
  •  2
  •   Eran Galperin    16 年前

    可能有几种方法可以解决这个问题:

    1. 只需使用setter,这是完全可以接受的,但如果有很多配置选项,可能会有点“冗长”。

    2. 使用config对象传入:

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

      class DB {
          const USER = 'mysqluser';
      }
      
      echo DB::USER; // for example
      
        3
  •  0
  •   kieranajp    10 年前

    我在两个方面做得很好:

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

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

      PASSWORD_LENGTH=12
      SEND_PASSWORD_EMAILS=1
      

    然后通过以下方式提供 getenv() $_ENV 超全球。

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