Design Patter by PHP[3]: Template Method
- Date
- 2006-10-18 (Wed)
- Category
- Design Pattern | Tech | php
日々是鍛錬。
第三回目は Template Method です。コードは前回に引き続き、Subversion のレポジトリ
をどうぞ。
今回の気づき
- 毎回思っていたけれど、PHP では名前空間の制約が厳しく、標準ライブラリに存在する関数と同じ名前の関数を定義できない。前2回分では、SPL で宣言されているクラス名と当たっていて、今回は標準関数の print だった。特に関数はなんとかしてもらいたい所ではある。だって内側から呼ぶのも $this つけなきゃ行けないわけだし、ambiguity はなさそうだけれども…
- println ってなかったっけ??
- 字数を数えるのにちょっと苦労した。以下 StringDisplay.php より
要するに、mb_strlen と strlen で数えてみて、一致してなかったらマルチバイト文字列と判断して、そうだったら、とりあえず2倍にしてある。ホントは private $is_mb とかつけて、printLine() を工夫すべきか、な。$this->width = mb_strlen($this->str); if ( $this->width != strlen($this->str) ) { $this->width = $this->width * 2; }少し正確に話すと、unicode では(ASCII 互換以外の文字列、いわゆるダブルバイトと呼ばれているもの)1文字3byte消費しているの(だよね?)で、『あ』の1文字で strlen では 3 という返り値、mb_strlen では 1 という返り値を得る。ま〜正確ではあるけど、使いやすくはないのかな〜- 追記 on March 2007: Unicode 、と一緒くたに語っていますが、これは正確じゃない。例えば(日本語の wikipedia によればほとんど使われていないらしいが) UTF-1 は 8-bit (≒ 1byte) コード。ここで語ろうとしている UTF-8 はマルチバイトで可変長 ( 1〜4 byte ) 。『あ』が 3byte だったのは“たまたま”。この実装は間違いですな。
実行結果は
$ php main.php
<<HHHHH>>
+-------------+
|Hello, World.|
|Hello, World.|
|Hello, World.|
|Hello, World.|
|Hello, World.|
+-------------+
+------------+
|こんにちは。|
|こんにちは。|
|こんにちは。|
|こんにちは。|
|こんにちは。|
+------------+
でした。
Comment:0
Trackback:0
- TrackBack URL for this entry
- http://blogs.grf-design.com/mt/mt-tb.cgi/193
- Listed below are links to weblogs that reference
- Design Patter by PHP[3]: Template Method from The Croton