在PHP5中,将配置变量放入类的最佳方式是什么?
这是给我的DB类的。我是OO的新手,已经做了一段时间的程序性工作,所以我还是有点模糊 我的第一个想法是使用一堆setter函数/方法。。但是在写了一大堆之后,我考虑使用PHP的define函数,就像这样在PHP5中,将配置变量放入类的最佳方式是什么?,php,oop,Php,Oop,这是给我的DB类的。我是OO的新手,已经做了一段时间的程序性工作,所以我还是有点模糊 我的第一个想法是使用一堆setter函数/方法。。但是在写了一大堆之后,我考虑使用PHP的define函数,就像这样 define('MYSQL_USERNAME', 'jimbo'); 这是公认的做法吗?最佳做法是什么?如果我真的要用一堆setter函数来混乱我的类,我是目前唯一使用这些类的开发人员。你的解决方案是什么 谢谢大家! 可能有几个选项可以解决这个问题: 只需使用setter,这是完全可以接受的,
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让我如坐针毡。为了简洁地创建匿名对象而必须这样做是荒谬的。感谢您的回复,我一定会在未来的开发中牢记这一点:现在您可以将它们放在名称空间而不是类中。