Zend_Configの履歴

概要

Zend_Configは値を全てZend_Configオブジェクトで管理している。

// こんなことができます!
$config->database->development->username;

マジックメソッド__getを定義しているので、配列アクセスと同様に階層を掘ることができる。

すぐに使える!Zend_Config

配列をそのまま渡せばOK。後で変更する場合は第2引数$allowModificationsをtrueにしておきましょう。

require_once 'Zend/Config.php';
$config = new Zend_Config(array(
    'development' => array(
        'database' => array(
            'username' => 'akkun', 
            'password' => 'akkun', 
            'dbname' => 'hoge'))));

echo $config->development->database->username;

iniファイルを使う

なファイルを作って適当な名前で保存。「.」で区切ることで階層構造になる。

development.database.dbname   = mydb
development.database.username = akkun
development.database.password = pass

こういう形式でもOK(セクションにすると継承や読み込み制御ができる)

[development]
database.dbname   = mydb
database.username = akkun
database.password = pass


呼び出し方

require_once 'Zend/Config/Ini.php';

$config = new Zend_Config_Ini(
  'config.ini', null, array('allowModifications' => true));

echo $config->development->database->username;

xmlファイルを使う

value属性ならいちいち囲まなくてもいい。

<?xml version="1.0"?>
<zend-config>
  <directory value="aa" />
</zend-config>

継承はextends属性。配列にするなら同じ要素を複数列挙するだけ。
ただし数値配列は添え字が指定できない(parseエラーになる)。これは回避できるのだろうか?

sample1.xml

<?xml version="1.0"?>
<zend-config>
  <directory>
    <file value="aaa" />
    <file value="bbb" />
    <file value="ccc" />
  </directory>
</zend-config>
$config = new Zend_Config_Xml('sample1.xml');
$config->directory->file->toArray() // array('aaa', 'bbb', 'ccc')


sample2.xml

<?xml version="1.0"?>
<zend-config>
  <directory>
    <file>
      <aaa value="a.file" />
      <bbb value="b.file" />
      <ccc value="c.file" />
    </file>
  </directory>
</zend-config>
$config = new Zend_Config_Xml('sample2.xml');
$config->directory->file->toArray()
  // array('aaa' => 'a.file', 'bbb' => 'b.file', 'ccc' => 'c.file')

PEAR::Configとの違いとか

  • 設定の継承ができる
  • iniファイルでも「.」区切りにより階層構造ができる。
    • でも値は「,」で区切られたやつを配列にしてくれない。
  • mergeメソッドで上書きできる。


雑感

Iniにすべきか?Xmlにすべきか?

iniファイルは単純なkey/valueの組み合わせの羅列が大量にある場合は便利。セクションを使えば2階層ぐらいは楽に書ける。階層が深くなる場合はXMLの方が有利かと思いきや、数値添え字の制約があって、思わぬところでハマる可能性大。


//これ、よくわからなぁ。Factory Method パターンで良かったじゃないか?new する方が見栄えがいいからか?