Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP5中,将配置变量放入类的最佳方式是什么?_Php_Oop - Fatal编程技术网

在PHP5中,将配置变量放入类的最佳方式是什么?

在PHP5中,将配置变量放入类的最佳方式是什么?,php,oop,Php,Oop,这是给我的DB类的。我是OO的新手,已经做了一段时间的程序性工作,所以我还是有点模糊 我的第一个想法是使用一堆setter函数/方法。。但是在写了一大堆之后,我考虑使用PHP的define函数,就像这样 define('MYSQL_USERNAME', 'jimbo'); 这是公认的做法吗?最佳做法是什么?如果我真的要用一堆setter函数来混乱我的类,我是目前唯一使用这些类的开发人员。你的解决方案是什么 谢谢大家! 可能有几个选项可以解决这个问题: 只需使用setter,这是完全可以接受的,

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

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

define('MYSQL_USERNAME', 'jimbo');
这是公认的做法吗?最佳做法是什么?如果我真的要用一堆setter函数来混乱我的类,我是目前唯一使用这些类的开发人员。你的解决方案是什么


谢谢大家!

可能有几个选项可以解决这个问题:

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

使用配置对象传入:

$config = (object) array(
   'prop1' => 'somevalue',
   'prop2' => 'somevalue2',
   'prop3' => 'somevalue3',
);

$db = new DB($config);
如果要使用常量,可以将它们限制在类中,以避免全局命名空间污染:

class DB {
    const USER = 'mysqluser';
}

echo DB::USER; // for example

可能有几个选项可以解决这个问题:

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

使用配置对象传入:

$config = (object) array(
   'prop1' => 'somevalue',
   'prop2' => 'somevalue2',
   'prop3' => 'somevalue3',
);

$db = new DB($config);
如果要使用常量,可以将它们限制在类中,以避免全局命名空间污染:

class DB {
    const USER = 'mysqluser';
}

echo DB::USER; // for example
我只使用const为类中的不可变常量创建助记符名称。define函数不作为类的一部分创建常量,而是在全局空间中创建常量

class MyClass
{
  const CONFIG_FILE = 'myapp.ini';
我通常在类中将类配置数据声明为受保护的哈希数组。键对记忆法很有用。值是默认值

  protected $config = array(
    'logfile' => 'err.out',
    'debug' => false
  );
然后,我加载一个带有parse_ini_文件的ini格式文件,并使用array_merge将键映射到类配置数组中:

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

}
我只使用const为类中的不可变常量创建助记符名称。define函数不作为类的一部分创建常量,而是在全局空间中创建常量

class MyClass
{
  const CONFIG_FILE = 'myapp.ini';
我通常在类中将类配置数据声明为受保护的哈希数组。键对记忆法很有用。值是默认值

  protected $config = array(
    'logfile' => 'err.out',
    'debug' => false
  );
然后,我加载一个带有parse_ini_文件的ini格式文件,并使用array_merge将键映射到类配置数组中:

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

}

我通过两种方式成功地做到了这一点:

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

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

PASSWORD_LENGTH=12
SEND_PASSWORD_EMAILS=1
然后通过getenv或$\u ENV superglobal提供

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

我通过两种方式成功地做到了这一点:

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

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

PASSWORD_LENGTH=12
SEND_PASSWORD_EMAILS=1
然后通过getenv或$\u ENV superglobal提供

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

解析ini文件的开销是什么?你认为这会成为一个问题吗?我想PHP中的键控数组会快得多?如何保护这个INI文件?将其放在根web可访问目录之上?解析PHP文件与读取ini文件没有明显区别。是的,保护ini文件就像保护其他类声明代码一样,将其放在docroot之外。只有实际的PHP模板文件需要被访问。这听起来像是最好的解决方案,因为我知道ini对设计师来说比键控数组更有意义,所以我将把它放在我的docroot之上,并命名为something.ini.PHP谢谢!解析ini文件的开销是什么?你认为这会成为一个问题吗?我想PHP中的键控数组会快得多?如何保护这个INI文件?将其放在根web可访问目录之上?解析PHP文件与读取ini文件没有明显区别。是的,保护ini文件就像保护其他类声明代码一样,将其放在docroot之外。只有实际的PHP模板文件需要被访问。这听起来像是最好的解决方案,因为我知道ini对设计师来说比键控数组更有意义,所以我将把它放在我的docroot之上,并命名为something.ini.PHP谢谢!天哪,PHP让我牙齿发痒。为了简洁地创建匿名对象而不得不这么做是荒谬的。感谢您的回复,我一定会在未来的开发中牢记这一点:现在您可以将它们放在名称空间而不是类中。天哪,PHP让我如坐针毡。为了简洁地创建匿名对象而必须这样做是荒谬的。感谢您的回复,我一定会在未来的开发中牢记这一点:现在您可以将它们放在名称空间而不是类中。