Python hack-a-thon #2にて一人でrhaco2
2009年11月14日(土) 17:58
ま、こんなものもあったし。rhaco2やれってことだよね。
重要そうなcore.spl.Objectを読む
実はPHPを学ぶことっぽい。
self
selfは自分自身のスタティックメソッド等を呼ぶときに使うものらしい。
PythonやPerlではインスタンスが自分自身を表す名前として便宜的に使ってる同じ名前がPHPなのに$なしで出現する。
self::execute_modules
ちなみに、スタティックに参照するときは::みたい。
clone
オブジェクトの代入はシャローコピー。cloneを使えばディープコピーできる。
$x = clone($obj);
is_object
引数がオブジェクト(stdClassから派生したもの?)かどうか判定する。
phpのインタラクティブシェルで確認してみる。readline付きでコンパイルしてあればphpの宣言文はいらないらしいけど…
<?php $a = new stdClass(); print is_object($a); 1 $d['dict'] = 'php hash'; print is_object($d); print is_array($d); 1
連想配列はArrayだそうです。へーへーへー
method_exists
module_existsというメソッドがrhaco2のObjectクラスに定義されていたので、これもrhaco2のものかと思ったら、標準関数だった。
rhaco2のmodule_existsはこの関数に名前があわせてあるんだと思うけど、has_methodとかの方がわかりやすい気がするなー。
カスなのでググったところ、スタティックメソッドの場合の例が乗ってるページがあるんだけど何を言いたいのか意味が分からなかったので追試。
<?php class X extends stdClass { static final function st_method() {} final function it_method() {} } $x = new X(); var_dump(method_exists($x, 'st_method')); bool(true) var_dump(method_exists($x, 'it_method')); bool(true) var_dump(method_exists($x, 'hoge')); bool(false)結局、スタティックメソッドでも同様になるということがいいたかったのか。
なぜかvar_dumpしないと結果がプリントされなかった。なぜなんだ。
ReflectionClass
リフレクションなクラス。一時変数名が$refになっててちょいときもい。ただそれだけ。
そろそろあきらめた
あきらめたというか、なんだか見てたらキモくて書きたくなった。 rhaco2楽しいよ><
uc
ドキュメント代わりのdoctest(実行可能なドキュメントで各関数なりのコード中に記述されている)に出てきた。 UniqueClassの略(ラッパ)。 PHPにはdoctestなんて仕様はないのでほかのテストで生成したクラスとかぶらないように使うものだと思われる。 ユニークな名前でクラスを生成してるっぽい。
こんな感じで使う:
/*** uc($name1,' public $aaa; protected function __div__($arg){ if($arg instanceof self){ $this->aaa = str_replace($arg->aaa(),"",$this->aaa); } } '); $obj1 = new $name1("aaa=hogefuga"); $obj2 = new $name1("aaa=fuga"); eq("hogefuga",$obj1->aaa()); eq("hoge",$obj1->div($obj2)->aaa()); */ま、テスト以外では使うなといわれたよ。
func_annotation / var_annotation
関数と変数にアノテーションできる仕組み。言語的にアノテーションできないので、少しあれな書き方になる。:
/*** uc($class1,' static protected $__aaa__ = "type=choice(AA,BB,CC)"; static protected $__bbb__ = "type=choice(\'aaa\',\'bbb\',\'cc,c\')"; static protected $__ccc__ = "type=choice"; protected $aaa; protected $bbb; protected $ccc; protected function __choices_ccc__(){ return array("111","222",333); } '); $obj = new $class1(); $obj->aaa("BB"); $obj->bbb("bbb"); $obj->ccc("222"); eq(array("AA","BB","CC"),$obj->a("aaa","choices")); eq(array("aaa","bbb","cc,c"),$obj->a("bbb","choices")); eq(array("111","222","333"),$obj->a("ccc","choices")); */$aaaに$__aaa__でアノテーションしてる。typeを指定しておくと、$obj->aaa($arg)したときに型やとりうる値をチェックしてくれる。 __choices_ccc__は実行時にとりうる値を動的に指定したい場合に使うみたい。 typeの種類はset_class_memberメソッドを見れば書いてある。
__fm_attr__
$objの$aaaに対してフォーマッティングしたい場合に、何も考えずに$obj->fmAaa()を呼び出すと、__fm_attr__というメソッドが呼び出される。 ただし、これはObjectクラスに以下のような定義箇所があり、個別の設定ができるようになっている。:
static protected $___fm_attr___ = "prefix=format";
たとえば$aaaという変数に対してだけ特別な処理を行いたい場合には、次のようなメソッドを定義しておけばこっちが呼び出されるようになる(アクセサはよくわかってないから省いてる)
function formatAaa() { ..do something };
ほかにもこれ系はいろいろあるので、Objectクラスを見ると楽しいはず。ちなみにprivateは動きが変わっても知らんそうだよ。他だって知らんだろうけど。
続きはFlowとDao
