我有一个配置文件,其中包含一系列设置/参数。我遇到的问题是从一个类中访问这个数组。我的第一个猜测是做这样的事情。
设置文件:
$config = array (
'db' => array (
'host' => 'localhost',
'password' => 'password',
'port' => 3306,
'database' => 'my_db',
'user' => 'root'
),
'email' => array (
'username' => 'someone@somewhere.com',
'smtp' => 'smtp.somewhere.com',
'ssl' => true,
'password' => 'my_password',
'port' => 587
)
// other stuff
);
Confiuration类
class CoreConfig
{
static $confArray;
public static function read($name)
{
return self::$confArray[$name];
}
public static function write($name, $value)
{
self::$confArray[$name] = $value;
}
}
并使用它:CoreConfig::write('username', $config['email']['username']);
。在类中使用它的示例:
用法
class SomeClass {
public function __construct() {}
public function getUserName() {
return CoreConfig::read('username');
}
}
虽然这有效,但感觉它被认为是不好的做法。或者,我可以采用最初的$config
并立即将其加载到我的$confArray
而不是#34;写作#34;这看起来更糟糕。还有另一种方法吗?
答案 0 :(得分:1)
即使您正在执行配置文件,在应用程序中对任何内容进行硬编码也确实有点奇怪。有很多方法可以做你正在尝试做的事情,但最重要的是保持所有"硬编码"价值在同一个地方。
如果您可以访问任何类型的SQL来完成工作,我建议将所有配置值放在数据表中。这样做,您可以避免在代码中直接使用任何硬编码值,因为它们位于数据库中。
配置类
class CoreConfig
{
static $confArray = null;
public static function read($name)
{
if(self::$confArray == null)
self::loadConfig();
return self::$confArray[$name];
}
private static function loadConfig()
{
self::$confArray = DatabaseManager::fetchAll("SELECT * FROM config");
}
}
数据库管理员课程
class DatabaseManager
{
private static $instance = null;
private static $host = "YOUR HOST NAME HERE";
private static $dbName = "YOUR DATABASE NAME";
private static $dbUser = "YOUR DATABASE USER";
private static $dbPass = "YOUR DATABASE PASSWORD";
private function __construct() {}
private static function getDb()
{
if(is_null(self::$instance))
{
self::$instance = new PDO("mysql:host=" .self::$host. ";dbname=" .self::$dbName, self::$dbUser, self::$dbPass);
self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
return self::$instance;
}
public static function fetchAll($SQL)
{
$return = null;
try
{
$return = self::getDb()->query($SQL)->fetchAll();
}
catch(Exception $e)
{
// If you want to display errors directly on the page
echo "SQL Query Error<br />";
echo "Request: $SQL<br />";
echo $e->getMessage();
}
return $return;
}
}
您可以在php.net上引用PDO Documentation以向数据库管理器添加功能。如果您希望能够使用PHP在数据库中编写,则必须添加更多方法。
如果没有数据库选项,则可以使用XML或JSON配置文件,并在读取其值时将其解析为数组。
希望这有帮助!