y-matsui::weblog

電子楽器、音楽、コンピュータ、プログラミング、雑感。面倒くさいオヤジの独り言

MySQL+PHP+Pear+Smarty

MySQL 5.0.77、PHP 5.1.6、PEARSmarty 2.6.26とGoogleMapsでWebアプリを開発中。
山田祥寛さんの”今日から使えるPHP5サンプル集”をカンニングしつつ、SmartyのサイトやGoogleさんのお力添えあってのこと。いつまでも素人というか、初学者というか、いつも誰かに教えてもらっている立場ってのも悲しくなってくるが、知らなければならないことが多いし、技術がころころ変わるのでそんなことも言ってられない。
今回の目玉は、はじめてのSmarty。テンプレートエンジンという言葉だけ知っていて、今回初めて仕事で使ってみたという次第。「ASP.NETみたいにクラスと表示用モジュールなんかが分かれてるんでしょ?」と思っていたが、誤解を恐れずに言えば、「まぁ大体そんな感じ」
これで保守性が向上したり、Webデザイナーとの協業がしやすかったりといったメリットが出てくるらしいが、実際には分からない。foreachだのifだののsmartyタグを駆使したフォームを、はたしてデザイン屋さんはどのように見るのか?
(「生のPHPが混在しているのとそんなに変わらないじゃないか」ってなるかもしれない)
GoogleMapsの方は、PHPからXMLを書き出し、GXmlHttpで描画とか、GoogleEarthで別途作成したKMLをオーバーレイするなんていうことを初めてやってみた。
これも、ソースのデータの分離というか、JavascriptやHTMLソースの中からデータ記述を追い出すということで、なかなかGood。大体、データをXMLで取得したら、あとはクライアント側で何とかする・・という考え方が良い。デバイスに依存するコードは、クライアント側のスクリプトを書き直せば良い。

■GXmlHttpを使うに当たって
PHPからXMLを書き出す際、レスポンスヘッダ文字列に
header("Content-Type: text/xml");
なんていう文字列を送るのだが、PHPソースコードで、?>とEOFの間に、スペースや改行が入っていると、ヘッダ送信時にエラーを起こす。
これに気がつくのにずいぶん時間が掛かった。
それから、XMLがクロスドメインでは取得できないこと。要注意だ。

「'x'はNullまたはオブジェクトではありません。main.js」なんていうエラーが出る場合がある。
これは、GXmlHttpで非同期通信をtrueにしている場合に、Javascriptの実行タイミングが合わなくて発生するようだ。
var request=GXmlHttp.create();
request.open("GET",URLがここに入る,false); ←第三引数をfalseに変更
非同期通信をする必要がないところは、falseにしておくのが吉かと思う。

Smartyを使った開発
MVCなんていうデザインパターンがあるらしい。
デザイン(ビュー、UI部分のHTMLコード)と、コントローラ(処理自身を担当するコード)、モデル(フォームからPOSTされた値を保持するクラス、DBへの書き込みや参照を行うメソッド)を分けて作ると良さげとか。
自分の場合は、内部的に呼び出すクラスには、*.class.php、外から呼ぶプログラムは*.php、UIテンプレートは*.tplという名前にしている。以前PHPを使った時は、せいぜい機能単位にphpファイルを分けて、デザイン部分も処理部分も先頭から最後までだらだらと記述する感じだったであるが、今回は違う。
クラスを使って、「何度も似たようなことを書かない。安易にコピーしない。変数の大爆発を起こさせない。」ことを徹底し。
get、setでちゃんとローカル変数に対して読み書き、テンプレートに表示用のHTMLを書き、表示と実体をきちんと切り分ける。
おかげさまで、生成するファイル本数は、少なくとも3倍に膨れ上がり、複雑さが増したよう。
保守を考えて、役割毎のファイル分割にしているとは言え、やはりまどろっこしい。
修正が、他の部分に波及しないかどうかも、微妙。MVCとかオブジェクト指向だとか、正しく使えているかどうか、いまいち自信はない。
ただ、バグ発生が減り、テスト工数が減ったり、修正の手間が軽減されているように集約したり、標準化していけば、ハッピーな未来が約束されるんだろう。
今は、実感が無いけど。

■ファイル整合の問題
役割の違う複数のファイルの関係は、自分が管理しなけりゃいけないわけで、このあたり、フレームワークだとか、統合開発環境なんかで吸収していただけると大変ありがたい。この点でASP.NETはエライ。知らないが、Ruby on Railsもエライに違いない。