从类中访问数组

时间:2014-07-17 20:02:53

标签: php

我有一个配置文件,其中包含一系列设置/参数。我遇到的问题是从一个类中访问这个数组。我的第一个猜测是做这样的事情。

设置文件:

$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;这看起来更糟糕。还有另一种方法吗?

1 个答案:

答案 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配置文件,并在读取其值时将其解析为数组。

希望这有帮助!