Python hack-a-thon #2にて一人でrhaco2

2009年11月14日(土) 17:58

ま、こんなものもあったし。rhaco2やれってことだよね。

http://img.skitch.com/20091114-nqmqd6geat63p637ryyct8584w.pngwidth:98pxheight:87px

重要そうな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());
    */
    

    ま、テスト以外では使うなといわれたよ。

    http://img.skitch.com/20091114-r77atri3tsc6si1wbsqxgaeupa.pngwidth:470pxheight:140px
  • 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


 
ponybadge

Powered by

Feedbacks

Tweets

Tags

Calendar