それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Spyc PHPのYAML実装


PHPにはYAMLに、Spyc.class.phpを使う。Symfonyにも組み込まれていり。コレ便利。他にも使っている。



PHPからYAMLを扱うには。とてもSimple

YAMLを配列にロードする。

$yml ="--
hoge:
 - bar
foo:
 bar: 1";
$array = Spyc::YAMLLoad($yml);#引数は文字列、またはファイル名のどちらか

#static以外にインスタンスを使っても良い
$spyc = new Spyc;
$array = $spyc->load("settings.yml");

配列をYAMLにロードする。

$array[] = array("a", "b", "c");
$array["test"] = array("1", "2", "3");
$yml = Spyc::YAMLDump($array);

これだけ。YAMLをどんどん使いましょう。

これ以外にも設定には、parse_ini_file、JSON、serialize、Pear::Configが使えます。組み合わせて使うと嬉しい。

JavaのProperitesとYAMLをマージしつつ、XMLで出力して遊ぶ。

Pear::Configと組み合わせYAMLXMLと相互変換

$config = new Config();
$prop   = $config->parseConfig( "GenericConf",
                                "java.properties"
                                array("comment" =>"#",
                                      "equals"  =>"=",
                                      "newline" =>"\\" );
                               );
$array = $prop->toArray("PHPArray");
$yaml  = Spyc::YAMLLoad("perl.dumper.yml");
$array = array_merge( $array, $yaml );
$element = $config->parseConfig( "PHPArray", $array );

$xml = $element->toString("xml");

YAMLXMLに変換したり、PHPのINIファイルにしたり相互変換がとても便利です。相互変換にはPear::Config_Container_PHPArray を経由しています。変換するときに、toString($TARGET_TYPE);と書くのがミソ。


ただ、APIドキュメントがないので、Hackできないじゃん。と思ってSpycをphpDocumentorに掛けてみた。


Spyc.class.phpの概要

Variable Summary Description | Vars (details) | Methods (details)

  • mixed $_allNodes
  • mixed $_dumpIndent
  • mixed $_dumpWordWrap
  • mixed $_haveRefs
  • mixed $_inBlock
  • mixed $_isInline
  • mixed $_lastIndent
  • mixed $_lastNode

Method Summary Description | Vars (details) | Methods (details)

  • static string YAMLDump (array $array, [int $indent = false], [int $wordwrap = false])
  • static array YAMLLoad (string $input)
  • string dump (array $array, [int $indent = false], [int $wordwrap = false])
  • array load (string $input)
  • array _array_kmerge (array $arr1, array $arr2)
  • array _buildArray ()
  • string _doFolding ($value $value, $indent)
  • string _doLiteralBlock ($value $value, $indent $indent)
  • string _dumpNode ($key $key, $value $value, $indent $indent)
  • array _gatherChildren (int $nid)
  • int _getIndent (string $line)
  • array _inlineEscape ( $inline)
  • void _linkRef ( &$n, $key, [ $k = null], [ $v = null])
  • bool _linkReferences ()
  • bool _makeReferences ( &$z, object $z)
  • boolean _nodeArrayizeData ( &$node, array $node)
  • array _parseLine (string $line)
  • mixed _toType (string $value)
  • string _yamlize ($key $key, $value $value, $indent $indent)
  • string _yamlizeArray ($array $array, $indent $indent)


殆ど全てがProtectedかPrivate。なのでHackすることが、なにもない。Pear::Configと組み合わせて相互変換くらいか。

残念なのは、YAMLをロードするとHASHになること。Pear::ConfigもArrayを扱う。オブジェクトでロードできたら便利だろうけど。。。リフレクション書いてみようかな。