Design Patter by PHP[7]: Builder
- Date
- 2006-12-03 (Sun)
- Category
- Design Pattern
第七回目は Builder です。
また今回は、Browser から実行できるようにしてみました。以下を試してみてください。
コードはいつも通り、Subversion のレポジトリにあります。
http://svn.nydd.org/dpxphp/Builder/
今回の気づき
- 結城さんの本の中では、Director クラスのコンストラクタの第一引数の型として Builder クラスが指定してある。PHP でも version 5 から、タイプヒンティング(typehinting)と呼ばれる、code 表現上では似たようなことができるようになった。
しかしこれはコード表現が似ているだけ。 - Java では、継承する親の型を指定しておくことで、後に呼び出すことになる共通のメンバメソッドを強制することができるし、それが内部インターフェイスとしての役割を果たす。
今回の Director.php でタイプヒンティングをすると、コンストラクタを呼び出す所で、Argument 1 passed to Director::__construct() must be an instance of Builder というエラーが起きる。つまりタイプヒンティングは型チェックをするだけなんですな(PHP は弱い型なので、当然なのか、な)。そういう意味では、Director クラスは、クラスではなく、インターフェイスにした方が、self explanatory だったかもしれない。 - 追記 on March 2007: 嘘。Java の知識も曖昧です。今度書き直す。。
HTMLBuilder の中で、 DOM 関数を使用しているのだけれど、この DOM 関数は CLI 環境では存在しなかった。
勘違い。この間 Mac OS X のセキュリティアップデートをしたから、一部のローカル設定が消去されて、デフォルト組み込みの PHP 4.4 がコマンドラインでは起動していたのだった。。- 暫く DOM 関数を使っていなかったので、勝手を忘れていてちょっと困った。というわけでいかにもう一度以下にまとめておきます。
PHP の DOM 関数の注意
動作確認に使用したのは、PHP Version 5.1.2 / libxml 2.6.16 のようです。
どういうことか。以下のコード参照。
<?php
$domdoc = new DOMDocument();
$html = new DOMElement('html');
$head = new DOMElement('head');
$title = new DOMElement('title', 'WTF');
$head->appendChild($title);
$domdoc->appendChild($html);
$html->appendChild($head);
?>
上記コードは、動かない。実行すると 8行目で 'No Modification Allowed Error' というエラーが出る。理由はよくわかりませんが… しかし独立していなければ、DOMElement も appendChild できる、ということは、下のように実行順序を変えるだけでこのコードは動く。
<?php
$domdoc = new DOMDocument();
$html = new DOMElement('html');
$head = new DOMElement('head');
$title = new DOMElement('title', 'WTF');
$domdoc->appendChild($html);
$html->appendChild($head);
$head->appendChild($title);
?>
もうちょっと書き方を変えると、以下のようにも書ける。
<?php
$domdoc = new DOMDocument();
$html = new DOMElement('html');
$head = $html->appendChild( new DOMElement('head') );
$title = $head->appendChild( new DOMElement('title', 'WTF') );
?>
最後のが一番シンプルな気もするけれど、場合によりけりでしょう。一番意味の通るものを使うべきだと思います。
この Design Pattern by PHP シリーズがいつも参考にしているのは以下の本です。
Comment:0
Trackback:0
- TrackBack URL for this entry
- http://blogs.grf-design.com/mt/mt-tb.cgi/198
- Listed below are links to weblogs that reference
- Design Patter by PHP[7]: Builder from The Croton
