4
<?php
define('ABSPATH', dirname(__FILE__)); //Absolute path to index

/*
* Method 1
* Dependency Injection
*/
class Config{

    private $_config = NULL;
    private $_filepath = NULL;

    public function __construct($filepath){
        $this->_filepath = $filepath;
        $this->load();
    }

    private function load(){
        if ($this->_config === NULL){
            if (!file_exists($this->_filepath)){
                throw new Exception('Configuration file not found');
            }else{
                $this->_config = parse_ini_file($this->_filepath);
            }
        }
    }

    public function get($key){
        if ($this->_config === NULL){
            throw new Exception('Configuration file is not loaded');
        }
        if (isset($this->_config[$key])){
            return $this->_config[$key];
        }else{
            throw new Exception('Variable ' . $key . ' does not exist in configuration file');
        }
    }
}

function getLost($where, $why, $who){
    //do smth
}

try{
    $config = new Config(ABSPATH . '/app/config.ini');
    getLost('here', 'because', $config->get('who'));    
}catch(Exception $e){
    echo $e->getMessage();
}
?>

<?php
/*
* Method 2
* Config is accessed via static class
*/

class Config{

    private static $_config = NULL;
    private static $_filepath = NULL;

    public static function load($filepath){
        if (self::$_config === NULL){
            self::$_filepath = $filepath;
            if (!file_exists(self::$_filepath)){
                throw new Exception('Configuration file not found');
            }else{
                self::$_config = parse_ini_file(self::$_filepath);
            }
        }
    }

    public static function get($key){
        if (self::$_config !== NULL){
            throw new Exception('Configuration file is not loaded');
        }
        if (isset(self::$_config[$key])){
            return self::$_config[$key];
        }else{
            throw new Exception('Variable ' . $key . ' does not exist in configuration file');
        }
    }
}

function getLost($where, $why){
    $who = Config::get('who');
}

try{
    Config::load(ABSPATH . '/app/config.ini');
    getLost('here', 'because');    
}catch(Exception $e){
    echo $e->getMessage();
}
?>

<?php
/**
* Method 3
* Config variable needed is passed as function parameter
*/
$config = parse_ini_file(ABSPATH . '/app/config.ini');

function getLost($where, $why, $who){
    //do smth
}

getLost('here', 'because', $config['who']);
?>

<?php
/*
* Mathod 4
* Config is accessed inside a function via global
*/
$config = parse_ini_file(ABSPATH . '/app/config.ini');

function getLost($where, $why){
    global $config;
    $who = $config['who'];
}

getLost('here', 'because');
?>

这些变体中的哪一个是最佳实践解决方案?如果没有,请提供您的变体。

4

2 回答 2

2

如果您将 $config 替换为 $onlyTheStuffThatMattersToThatFunction,我会说第一种情况会更好

于 2012-07-16T16:08:40.933 回答
2

我会选择变体 1(依赖注入)。

变体 2 使用static已经说明的方法,只是另一种global方法。我们都知道这很糟糕,对吧?对?

变体 3 不是我最喜欢的,因为它不够 OOP ;-),但很严重:如果您(或使用您的代码的人)想要更改配置文件的格式怎么办?

变体 4:global...

所以基本上我对其他选项的问题是:可测试性、紧密耦合、全局。

所以变体 1 是。我还将为配置类创建一个接口,以便您稍后可以为您的配置内容添加一个不同的类。例如,您(或其他人)想要使用 XML 文件进行配置。

我要改变的另一件事是private东西。如果有人想扩展类,他/她将无法以这种方式访问​​变量。我的经验法则(不确定是否每个人都同意这一点)只有private在您希望人们可以访问它时才制作东西(例如,它会在某个时候改变)。使用的危险private是人们会通过黑客绕过它来做他们想做的事。

阅读有关SOLID的更多信息并查看 Google干净代码讨论以获取更多信息。

只是我的2美分。

于 2012-07-17T16:44:10.990 回答