这是我的DB课程。我是OO的新手,已经有一段时间了,所以我还是有点模糊。
我的第一个想法是使用了一堆setter函数/方法..但是在编写了一大堆之后,我想到了使用PHP的define函数,就像这样。
define('MYSQL_USERNAME', 'jimbo');
这是一种公认的做法吗?什么是最佳做法?我是否真的会用一堆setter函数来混乱我的类(我目前是唯一使用这些类的开发人员)。你有什么解决方案?
谢谢!
答案 0 :(得分:2)
可能有一些方法可以解决这个问题:
只需使用setter,它是完全可以接受的,但可以通过大量的配置选项获得一些“罗嗦”。
使用配置对象传入:
$config = (object) array(
'prop1' => 'somevalue',
'prop2' => 'somevalue2',
'prop3' => 'somevalue3',
);
$db = new DB($config);
如果你想使用常量,可以将它们限制在类中以避免全局命名空间污染:
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)
我在两个方面取得了很大的成功:
正如@Owen建议的那样,使用类常量
class Config {
const PASSWORD_LENGTH = 12;
const SEND_PASSWORD_EMAILS = true;
// ...
}
对于简单的配置变量(即没有数组等),作曲家可用的包vlucas/phpdotenv做得很好。文件.env
包含您的所有配置:
PASSWORD_LENGTH=12
SEND_PASSWORD_EMAILS=1
然后可以通过getenv()
或$_ENV
超级全球版提供。
Dotenv::load(__DIR__);
$passwordLength = $_ENV['PASSWORD_LENGTH']