今回は、
Syck for PHP
Syckは、
Webサイト | http:// |
---|---|
ダウンロード | http:// |
バ-ジョン | 0. |
ドキュメント | なし |
その他 | PHP 5. |
作者 | Alexey Zakhlestin |
インストール
インストールは
$ wget http://pecl.php.net/get/syck-0.9.2.tgz $ sudo pear install syck-0.9.2.tgz $ ls /usr/local/lib/php/extensions/no-debug-non-zts-20060613/ syck.so # syck.so があることを確かめる $ sudo vi /usr/local/lib/php.ini ### 以下を追加する ### extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613"
使い方
PHPにおけるSyckの使い方は、
- syck_
load() - YAMLドキュメントを読み込む
- syck_
dump() - データをYAMLドキュメントに変換する
syck_
<?php
// 拡張モジュールsyck.soを読み込む
if (! extension_loaded('syck')) {
dl('syck.so') or die('cannot load syck extension.');
}
// YAMLドキュメントを読み込む
$str = file_get_contents("example.yaml");
$ydoc = syck_load($str);
var_dump($ydoc);
// データをYAMLドキュメントに変換
echo syck_dump($ydoc);
?>
日本語の扱い
読み込み
不具合
yck for PHPは、
- syck_
load() - 循環構造を持つデータがあるとエラーになる
(リスト3) - syck_
dump() - 独自クラスのインスタンスオブジェクトがYAMLへ変換できない
- 配列が循環構造を持っているとエラー
(Segmentation fault) になる (リスト4)
syck_
- &m1
name: Foo
child:
name: Bar
parent: *m1
<?php
$arr1 = array(10);
$arr2 = array(20);
$arr1[] =& $arr2;
$arr2[] =& $arr1;
echo syck_dump($arr1);
?>
その他
PHPでは、
実際の動作としては、
- インデックスが0から始まり、
かつ連続していた場合はシーケンスに変換 - それ以外の場合はマッピングに変換
<?
// インデックスが0から始まり連続していた場合は
// シーケンスへ変換される
$arr = array();
$arr[0] = 10;
$arr[1] = 20;
$arr[2] = 30;
echo syck_dump($arr); //=> [10, 20, 30]
// インデックスが連続していない場合は
// マッピングへ変換される
$arr = array();
$arr[0] = 10;
$arr[2] = 30;
echo syck_dump($arr); //=> {0: 10, 2: 30}
?>
php_yaml
php_
なお余談ですが、
ダウンロード | http:// pub/ |
---|---|
バージョン | 0. |
ドキュメント | なし |
作者 | Ryusuke Sekiyam |
インストール
コンパイルするにはlibyamlをあらかじめインストールする必要があります。以下の手順でlibyamlをインストールしてください
$ wget http://pyyaml.org/download/libyaml/yaml-0.0.1.tar.gz $ tar xzf yaml-0.0.1.tar.gz $ cd yaml-0.0.1/ $ ./configure $ make $ sudo make install
続いて、
$ wget http://www.opendogs.org/pub/php_yaml-0.3.0.tgz $ tar xzf php_yaml-0.3.0.tgz $ cd php_yaml-0.3.0/ $ wget http://www.kuwata-lab.com/materials/php_yaml-0.3.0.patch $ patch -p1
使い方
php_
- yaml_
parse($str [, $index [, $count [, $callbacks]]]) - YAML文字列を読み込む
- yaml_
parse_ file($str [, $index [, $count [, $callbacks]]]) - YAMLファイルを読み込む
- yaml_
parse_ url($str [, $index [, $count [, $callbacks]]]) - URLからYAMLドキュメントを読み込む
php_
<?php
// 拡張モジュールyaml.soを読み込む
if (! extension_loaded('yaml')) {
dl('yaml.so') or die('cannot load yaml.so.');
}
// YAMLドキュメントを読み込む
$str = file_get_contents("example.yaml");
$ydoc = yaml_parse($str);
// または $ydoc = yaml_parse_file("example.yaml");
var_dump($ydoc);
?>
ストリームを読み込むときは、
<?php
if (! extension_loaded('yaml')) {
dl('yaml.so') or die('cannot load yaml.so.');
}
// YAMLストリームを読み込む
$str = file_get_contents("example.yaml");
$ydocs = yaml_parse($str, -1, $count);
// または $ydocs = yaml_parse_file("example.yaml", -1, $count);
var_dump($ydocs); // YAMLドキュメントの配列
var_dump($count); // ドキュメント数
?>
なお日付および日時のスカラー値は、
- init_
set('yaml. decode_ timestamp', 1) なら、 1970年1月1日 00:00:00からの通算秒を返します - init_
set('yaml. decode_ timestamp', 2)なら、 関数date_ create()を使ってDateTimeオブジェクトに変換されます
date_
<?php
if (! extension_loaded('yaml')) {
dl('yaml.so') or die('cannot load yaml.so.');
}
/// 日付と日時をパースするよう設定する
if (function_exists('date_create')) {
ini_set('yaml.decode_timestamp', 2); // DateTimeオブジェクトを使う
} else {
ini_set('yaml.decode_timestamp', 1); // 秒数(整数値)を使う
}
$input = <<<END
- 2008-01-01
- 2008-01-01 12:34:56
- 2008-01-01 12:34:56 +9
END;
$ydoc = yaml_parse($input);
var_export($ydoc);
/// 実行結果(yaml.decode_timestampが1のとき):
/// array (
/// 0 => 1199113200,
/// 1 => 1199158496,
/// 2 => 1199158496,
/// )
?>
日本語の扱い
筆者が試した限りでは、
タグを変更する
クラスに対応するタグを登録するには、
ただし、
<?php
if (! extension_loaded('yaml')) {
dl('yaml.so') or die('cannot load yaml.so.');
}
/// クラス定義
class Color {
var $r, $g, $b;
function __construct($r, $g, $b) {
$this->r = $r;
$this->g = $g;
$this->b = $b;
}
/// オブジェクトを生成するstaticメソッド
static function create($arr) {
return new Color($arr['r'], $arr['g'], $arr['b']);
}
}
/// YAMLドキュメント
$input = <<<END
- !<color>
r: 0
g: 127
b: 255
END;
/// タグ名と、オブジェクトを生成するコールバック関数名を
/// 指定してパースする
$callbacks = array(
'color'=>'Color::create',
);
$ydoc = yaml_parse($input, 0, $count, $callbacks);
var_export($ydoc);
/// 実行結果:
/// array (
/// 0 =>
/// Color::__set_state(array(
/// 'r' => 0,
/// 'g' => 127,
/// 'b' => 255,
/// )),
/// )
?>
不具合
筆者が試した範囲では、
- マッピングのマージ
(<<) に未対応 - マッピングのデフォルト値
(=) に未対応 - 値がないときにNULLにならず空文字列になる
(パッチで修正済み) - 「2008-01-01 12:34:56」
のパターンの日時がパースできず文字列となる (パッチで修正済み) - 'y'や'n'が文字列ではなく真偽値と見なされる
[3]
その他
php_
Spyc
Spycは、
Webサイト | http:// |
---|---|
ダウンロード | http:// showfiles. |
バージョン | 0. |
作者 | Chris Wanstrath, Vlad Andersen |
インストール
インストールは、
$ wget http://downloads.sourceforge.net/spyc/spyc-0.3.beta.tar.gz $ cd spyc/ $ sudo cp spyc.php5 /usr/local/lib/php/spyc.php
使い方
Spycの基本的な使い方はリスト13のとおりです。機能としては次の2つだけであり、
- Spyc::YAMLLoad($filename)
- YAMLドキュメントを読み込む
- Spyc::YAMLDump($data)
- データをYAMLドキュメントに変換する
またSpyc::YAMLLoad()の引数にはファイル名を指定するため、
<?php
/// Syckを読み込む
require_once("spyc.php");
/// YAMLドキュメントファイルを読み込む
$data = Spyc::YAMLLoad("example.yaml");
var_dump($data);
/// または
/// $spyc = new Spyc();
/// $data = $spyc->load("example.yaml");
/// データをYAMLドキュメントに変換
echo Spyc::YAMLDump($data);
/// または
/// $spyc = new Spyc();
/// echo $spyc->dump($data);
?>
タグを変更する
Spycはタグをサポートしていません。
日本語の扱い
日本語は、
不具合
筆者が試した限りでは、
- Spyc::YAMLLoad()
- スカラーへのアンカーとエイリアスが解釈できない
「&m1 {A: 10}」 のようにアンカーとデータを同一行に書くと解釈されない - 日付や日時
(timestamp) が未サポート 「null」 と 「~」 が未サポート - マッピングのマージが未サポート
- ブロックスタイルの文字列があると無限ループになる
- 値がない場合にnullではなく空文字列になる
- マッピングのキーに日本語を使用すると文字化けする
- ルート要素がフロースタイルだと解釈できない
- フロースタイルに改行が入っていると解釈できない
- Spyc::YAMLDump()
- ルート要素がスカラーだとエラーになる
- 配列のキーが数字であれば必ずシーケンスに変換される
- マッピングとシーケンスが混ざって出力されることがある
(リスト14)
<?php
require_once("spyc.php");
$data = array('a', 'b'=>10, '4'=>'c');
echo Spyc::YAMLDump($data);
/// 実行結果:
/// ---
/// - a
/// b: 10
/// - c
?>
その他
Spycは、