2011-07-13 15 views
1

私のウェブサイトにはいくつかの設定オプションが必要です。PHPプロジェクトでの設定ファイルの使用

私は、異なるオプションが別々のファイルに置かれていれば、維持するのが最も簡単だと思いました。

また、さまざまな設定ファイルからオプションを取得するためのクラスが必要です。私は別の設定オプションについては、いくつかのファイルを持って、私はこのディレクトリに/セットアップ

というディレクトリを作成した私のウェブサイトのディレクトリ構造に

、例えば:/setup/base.php

内容のbase.phpは次のようになります:

ファイルを読み込み、さまざまなオプションを返すクラスを作成したいと思います。

class Options 
{ 
    function __construct($option) 
    { 
     if (!is_file(SETUP_DIR.'/'.$option.'.php')) { 
      thrown new Exception('Configuration file not found.'); 
     } 

     $options = // get information from file 

     return $options; // this should return the currencies and locations 
    } 
} 

$options = new Options('base'); 

しかし、これが正しい方法かどうかはわかりません。

もしそうなら、クラス内の設定ファイルからオプションを取得する方法について考えることはできません。

私にこれを手伝ったり、少なくとも正しい方向に向けることができますか?

+1

あなたはすべてのあなたのロードされたライブラリを維持し、レジストリを持っていますか? –

+0

さまざまなPHPファイルで設定を行い、必要に応じて(require_once()を使用して)簡単に設定できますか? – Fabianius

+0

@Karl:nopez。私はちょうどレジストリのために行くかもしれないが。 – PeeHaa

答えて

2

まあ、私はこの1つのための正しい方法があるとは思わない:Zendのは、.iniファイルを使用して、CodeIgniterでは、セットを持っていますSymfonyはYAMLを使います。 Wordpressはほとんどのものをデータベースに保存しており、それにはただ一つの設定ファイルしかありません。

個人的には、私はiniファイルの一部です - iniはすべての場所で使用されているので、「必要ならばこれを再利用できます」という気持ちがありますが、 "ここでの解決策は、矛盾する解決策です - もしあなたがiniを使用しているなら、配列、配列ならiniを使いますが、混ぜないでください。

あなたの場合、いくつかのオプションがあります。この2つは最も一般的なもののようです。

class Options 
{ 
    private $_options; 
    function __construct($option) 
    { 
     if (!is_file(SETUP_DIR.'/'.$option.'.php')) { 
      thrown new Exception('Configuration file not found.'); 
     } 

     require(SETUP_DIR.'/'.$option.'.php'); 
     $this->_options = $options; 
     // you shouldn't put a return in a constructor 
    } 

    // this will point to the internal _options variable. 
    // making it a read-only access to the values from $option 
    public function __get($name){ return $this->_options->$name; } 
} 

それとも、あなたはシングルトンパターンを使用し、ちょうど個々のクラスのオブジェクトを返すことができます::

あなたがラッパーを作成することができます(これらの例の両方がstdClassのオブジェクトがロードされたファイル内 $options命名されていることを前提として)
class OptionsRetriever 
{ 
    private $_fetched; 
    private static $_instance; 

    private __construct(){} 

    public static function &getInstance() 
    { 
     if(!isset(self::$_instance)) self::$_instance = new OptionsRetriever(); 
     return self::$_instance; 
    } 

    public function getConfig($name) 
    { 
     if(!isset($this->_fetched[ $name ])) 
     { 
      require(SETUP_DIR.'/'.$name.'.php'); 
      $this->_fetched[ $name ] = $options; 
     } 
     return $this->_fetched[ $name ]; 
    } 
} 

それとも、あなたはそれらを組み合わせることができ:

class Options 
{ 
    private $_options; 
    function __construct($options) 
    { 
     $this->_options = $options; 
    } 

    public function __get($name){ return $this->_options->$name; } 
} 

    // replace getConfig with this 
    public function getConfig($name) 
    { 
     if(!isset($this->_fetched[ $name ])) 
     { 
      require(SETUP_DIR.'/'.$name.'.php'); 
      $this->_fetched[ $name ] = new Options($options); 
     } 
     return $this->_fetched[ $name ]; 
    } 
0

PHPに直接格納されている値が間違っている場合は、変数、定数、クラスなどの値が入ったPHPファイルを直接インクルードする必要があります。

私が使いたい方法は、構成をXMLファイルに格納し、それを読み込んで解析する方法です。その形式を好むなら、JSONで同じメソッドを使うことができます。これらのファイルへのブラウザアクセスをブロックするようにしてください。

1

ので、同様にあなたは、Base.phpというファイルを単に含めることができます

class Options 
{ 
    function __construct($option) 
    { 
     if (!is_file(SETUP_DIR.'/'.$option.'.php')) { 
      thrown new Exception('Configuration file not found.'); 
     } 

     include_once(SETUP_DIR.'/'.$option.'.php'); 

     $options = $setup; // make sure your variable in the config is allways named $setup 

     return $options; // this should return the currencies and locations 
    } 
} 

$options = new Options('base'); 
echo $options->currencies[0]; //should print 'USD' provided that your base.php file from the question was used. 
関連する問題