前回のエントリーに対するコメントで、YAMLはでないですかねというコメントがあってちょっと触発されてZend_Config_Yamlについて色々考えてみました。一応最初に言っておきますが、Zend_Config_Yamlのようなものができたわけではないのであまり期待せず読んでください。 Zend_ConfigではINIファイルとXMLファイルが対応していますが、それぞれ内容のパースは

parse\_ini\_file()
simplexml\_load\_file()

というPHPに組み込みの関数で行っています。Zend_Yamlもないし、YAMLデータのパーサーもPHPに組み込まれていないのでZend_Config_Yamlというのがまだ実装されていないのでしょう。 YAML形式のデータのパーサーはPHPに組み込まれていませんが、拡張モジュールやライブラリとしてはいくつか実装されています。

  • PHP拡張モジュール Syck
  • PHPライブラリのspyc

YAMLの勉強がてらZend_Config_Yamlのようなものを作ってみようと思います(ただしYAMLの仕様まったく詳しくないのでおかしいところありましたらどんどん突込んでください)。 spycはphpファイルをダウンロードしてインクルードするだけで使えるのでまず最初に使ってみます。 YAML形式のデータのパースまでは以下のとおり簡単にできました。

require\_once "spyc/spyc.php5";

define("INPUT\_YAML\_FILE", './test.yaml');

// YAMLファイルをパースする
$res = Spyc::YAMLLoad(INPUT\_YAML\_FILE);

結果は配列形式になります。たとえば、以下のようなデータがあれば

Name: foo

- a
- b
- c

このようになります。

array(4) {
  \["Name"\]=>
  string(3) "foo"
  \[0\]=>
  string(1) "a"
  \[1\]=>
  string(1) "b"
  \[2\]=>
  string(1) "c"
}

ここで、Zend Frameworkのマニュアルには以下のように書いてあります。

例 5.1. Zend\_Config の使用例

通常は、Zend\_Config\_Ini あるいは Zend\_Config\_Xml のような
アダプタクラスを使用することが想定されています。 しかし、
もし設定データが PHP の配列として存在するのなら、 単にそれ
を Zend\_Config のコンストラクタに渡すだけで、 シンプルなオ
ブジェクト指向のインターフェイスを使用することができます。

ということは、以下のようにするだけでYAML形式のデータをZend_Configで扱えるようになったことになります。

$conf = new Zend\_Config($res);
echo $conf->Name; // foo が表示される
echo $conf->{0};  // a が表示される

YAMLの性質上{0}のようにプロパティにアクセスするような記述が多くなりそうです。 他の方法として、get()メソッドを使うこともできます。

echo $conf->get(0); // a が表示される

指定した要素がない場合のデフォルト値も指定できます。

echo $conf->get('bar', 'no data'); // no data が表示される

ここまでできたので、あとはZend_Config_IniやZend_Config_Xmlに倣ってZend_Config_Yamlを作ってみたいと思います。 ソースを見ると大体以下のような感じで実装すればよさそうです。

  • Zend_Configを継承する
  • コンストラクタのインターフェースは以下のような感じ __construct($filename, $section = null, $allowModifications = false)
  • 設定のデータを継承できるようにする

3番目のやつは、INIファイルの例をZend Frameworkのドキュメントから引用すると、

; 運用環境の設定データ
\[production\]
webhost                  = www.example.com
database.adapter         = pdo\_mysql
database.params.host     = db.example.com
database.params.username = dbuser
database.params.password = secret
database.params.dbname   = dbname

; 開発環境の設定データは、運用環境のデータを継承したうえで
; 必要に応じて値を上書きします
\[staging : production\]
database.params.host     = dev.example.com
database.params.username = devuser
database.params.password = devsecret

のようにINIファイルがあったとき、

$config = new Zend\_Config\_Ini(CONFIG\_INI\_FILE, 'staging');

のようにしてstagingセクションのデータを取得したときに

echo $config->webhost;

のように、継承元のproductionのデータも参照できるようにすることです。このような仕組みはYAMLにあるかどうかは調べないとわからないのです。というか、そもそもデータの継承は、INIファイルでは[foo : bar]、XMLのほうでは のような書き方になっていますが、これって独自で作っているような気がしますがどうなのでしょうか。 と、ここまで書いたところで遅くなってしまったので、続きは明日以降に書きたいと思います。 続きはこちら