概要
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属性ならいちいち囲まなくてもいい。
継承はextends属性。配列にするなら同じ要素を複数列挙するだけ。
ただし数値配列は添え字が指定できない(parseエラーになる)。これは回避できるのだろうか?
sample1.xml
$config = new Zend_Config_Xml('sample1.xml');
$config->directory->file->toArray() // array('aaa', 'bbb', 'ccc')
sample2.xml
$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ファイルは単純なkey/valueの組み合わせの羅列が大量にある場合は便利。セクションを使えば2階層ぐらいは楽に書ける。階層が深くなる場合はXMLの方が有利かと思いきや、数値添え字の制約があって、思わぬところでハマる可能性大。はぁ…。
継承はトップレベルでしか使えない。実装はZend_Config_XmlやZend_Config_Iniでやってるので、独自に作ればなんとでもできるんだろうけど…。
よくわからない点
Zend_Config_XmlやZend_Config_Iniがなんでこんなクラス設計になったのかがよくわからん。読み込んでparseしてるだけなのに、Zend_Config継承する必要なくね?ここはFactory Method パターンにするべきだと思うんだけど…。new する方がわかりやすいからかなぁ。