PHPでEXDocを作ってみる(準備)

C# で大方 EXDoc が動いたので、本命(?)の PHP で動かしてみるテスト。
いや、単純に

PHP: マジックメソッド – Manual
http://www.php.net/manual/ja/language.oop5.magic.php

を使えば、XML のタグ名や属性を直接書けるのでは?という思いつきです。

まずは、UIDD に従って、こんな風にコードが書けたらいいなぁ、というコードを作ります。

1
2
3
4
$doc = new EXDoc();
$els = $doc->members->person;
$els = $doc->members->person("name")->eq("masuda");
$doc->members->person("name")->value = "masuda";

何をやっているか分かりますよね。PHP の場合は / 演算子などの多重定義ができないので、普通にメソッド/プロパティ呼出しをします。
この、-> 演算子のところで、直接 members やら person やらを書くわけですが、これがメソッド名だったりプロパティ名だった利する訳です。

で、当然、このメソッドは定義していないのでエラーになります。が、PHP のマニュアルに書いてあるマジックメソッドを使うと、未定義のプロパティやメソッド名のエラーを拾うことができるのです。

これに対処したのが次の例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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 して返してやります。すると、先のコードがするするととおって、次の実行結果が得られます。

1
2
3
4
5
6
7
8
9
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ってことで。

カテゴリー: 開発, UIDD, EXDoc パーマリンク

PHPでEXDocを作ってみる(準備) への2件のフィードバック

  1. masuda のコメント:

    配列表示のところは、
    echo “func $name(‘”.join(“‘, ‘”,$args).”‘)\n”;
    で良いそうな。

  2. masuda のコメント:

    うぉッ!!! この操作って、既に SimpleXML でできるじゃん。
    SimpleXML を継承して eq メソッドやら value プロパティを作ったほうがよいかも。

コメントは停止中です。