C# で大方 EXDoc が動いたので、本命(?)の PHP で動かしてみるテスト。
いや、単純に
PHP: マジックメソッド – Manual
http://www.php.net/manual/ja/language.oop5.magic.php
を使えば、XML のタグ名や属性を直接書けるのでは?という思いつきです。
まずは、UIDD に従って、こんな風にコードが書けたらいいなぁ、というコードを作ります。
$doc = new EXDoc(); $els = $doc->members->person; $els = $doc->members->person("name")->eq("masuda"); $doc->members->person("name")->value = "masuda";
何をやっているか分かりますよね。PHP の場合は / 演算子などの多重定義ができないので、普通にメソッド/プロパティ呼出しをします。
この、-> 演算子のところで、直接 members やら person やらを書くわけですが、これがメソッド名だったりプロパティ名だった利する訳です。
で、当然、このメソッドは定義していないのでエラーになります。が、PHP のマニュアルに書いてあるマジックメソッドを使うと、未定義のプロパティやメソッド名のエラーを拾うことができるのです。
これに対処したのが次の例。
<?php class EXDoc { function __call($name,$args) { print "func $name("; foreach( $args as $a ) { print "$a "; } print ")\n"; return new EXDoc(); } function __get($name) { print "get $name\n"; return new EXDoc(); } function __set($name,$value) { print "set $name $value\n"; return new EXDoc(); } }
C# よりも更に簡単になります。未定義の関数やプロパティは、 __call __get, __set メソッドで取れるので、ここで、さらりと EXDoc を new して返してやります。すると、先のコードがするするととおって、次の実行結果が得られます。
D:\work\blog\src\php>php ex001.php get members get person get members func person(name ) func eq(masuda ) get members func person(name ) set value masuda
見事にエラーも出さずに、目的が(半分だけ)達成ッ!!!
# 確か、Ruby には動的にプロパティを作る方法があるのですが、PHP のように未定義のメソッドを拾うことができたかどうかは不明です。
あとは、内部的に SimleXML か DOM を使って操作すればOKってことで。
配列表示のところは、
echo “func $name(‘”.join(“‘, ‘”,$args).”‘)\n”;
で良いそうな。
うぉッ!!! この操作って、既に SimpleXML でできるじゃん。
SimpleXML を継承して eq メソッドやら value プロパティを作ったほうがよいかも。