【问题标题】:What is the best way to get config variables into a class in php 5?将配置变量放入 php 5 中的类的最佳方法是什么?
【发布时间】:2008-12-02 00:48:16
【问题描述】:

这是给我的数据库类的。我是OO的新手,做了一段时间的程序小伙子,所以我还是有点模糊。

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

define('MYSQL_USERNAME', 'jimbo');

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

谢谢!

【问题讨论】:

    标签: php oop


    【解决方案1】:

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

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

    类配置数据我通常在类中声明为protected hash-array。键对助记符很有用。值是默认值。

      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);
      }
    
    }
    

    【讨论】:

    • 解析ini文件的开销是多少?你认为这会成为一个问题吗?我想 PHP 中的键控数组会快得多?
    • 如何保护这个 INI 文件?将它放在根 Web 可访问目录之上?
    • 解析 PHP 文件与读取 ini 文件没有显着差异。
    • 是的,保护 ini 文件就像通过将任何其他类声明代码放在 docroot 之外来保护它一样。只需要访问实际的 PHP 模板文件。
    • 这听起来是最好的解决方案(因为我知道ini 对设计师来说比键控数组更有意义)所以我将把它放在我的docroot 之上并将它命名为something.ini。谢谢!
    【解决方案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
      

    【讨论】:

    • 天哪,PHP 让我牙痒痒。必须这样做才能“简洁”地创建一个匿名对象是荒谬的。
    • 感谢您的回复,我一定会在未来的发展中牢记这一点:)
    • 现在您可以将它们放在命名空间而不是类中。
    【解决方案3】:

    我在这方面取得了很好的成功,有两种方式:

    1. 按照@Owen 的建议,使用类常量

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

      PASSWORD_LENGTH=12
      SEND_PASSWORD_EMAILS=1
      

    然后通过getenv()$_ENV 超全局提供。

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

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 2015-09-05
      • 1970-01-01
      • 2014-01-28
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多