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

バリアント 1 (依存性注入) を使用します。

バリアント 2 はstatic、メソッドの別の方法として既に述べたメソッドを使用しglobalます。そして、私たちは皆、それが悪いことだと知っていますよね? 右?

バリアント 3 は、OOP が十分ではないため、私の好みではありません ;-) しかし、深刻です: あなた (またはあなたのコードを使用している人) が構成ファイルの形式を変更したい場合はどうすればよいでしょうか?

バリエーション 4: global...

基本的に、他のオプションに関する私の問題は、テスト容易性、密結合、グローバルです。

つまり、バリアント 1 です。構成クラスのインターフェイスも作成するので、後で構成用に別のクラスを追加できます。たとえば、あなた (または他の誰か) が構成に XML ファイルを使用したいとします。

私が変更するもう1つのことは、privateものです。誰かがクラスを拡張したい場合、この方法では変数にアクセスできません。私の経験則 (誰もがこれに同意するかどうかはわかりませんが) は、private人々がそれにアクセスできるようにしたい場合にのみ (たとえば、ある時点で変更される) ものを作成することです。使用の危険性privateは、人々がやりたいことをするためにハッキングによってそれを回避することです。

SOLIDの詳細については、Google のクリーン コードトークを参照してください。

ちょうど私の2セント。

于 2012-07-17T16:44:10.990 に答える
2

$config を $onlyTheStuffThatMattersToThatFunction に置き換えると、最初のケースの方が優れていると思います

于 2012-07-16T16:08:40.933 に答える