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ファイルは単純なkey/valueの組み合わせの羅列が大量にある場合は便利。セクションを使えば2階層ぐらいは楽に書ける。階層が深くなる場合はXMLの方が有利かと思いきや、数値添え字の制約があって、思わぬところでハマる可能性大。はぁ…。
継承はトップレベルでしか使えない。実装はZend_Config_XmlやZend_Config_Iniでやってるので、独自に作ればなんとでもできるんだろうけど…。
よくわからない点
Zend_Config_XmlやZend_Config_Iniがなんでこんなクラス設計になったのかがよくわからん。読み込んでparseしてるだけなのに、Zend_Config継承する必要なくね?ここはFactory Method パターンにするべきだと思うんだけど…。new する方がわかりやすいからかなぁ。