ZendFrameworkで作る『イマドキ』のWebアプリケーション

第0回PHPのWeb開発フレームワーク

PHPは構文も容易で、開発者が言語を習得するのは非常に簡単です。また、性能もよいためWebアプリケーション構築に幅広く利用されています。

PHPが開発され始めた頃は、WebアプリケーションといえばCGIインターフェースを利用し、既存の汎用言語でプログラミングするのが一般的でした。PHPは、URIやPOSTリクエストのデコードや、HTTPセッション管理を標準機能として持っています。埋め込み型言語であるので、PHP自体がテンプレートとも言えます。PHPは汎用プログラミング言語としても利用できますが、簡易版のWeb開発フレームワーク(以下フレームワーク)と言えます。

筆者はこれがPHPが非常に人気の高い言語になった理由の一つだと考えています。しかし、PHP本体のフレームワーク的な機能は現在のフレームワークとしては不十分です。このため、PHP用のフレームワークが多数開発されています。

本連載は、ZendFramekworkを用いたRESTfulで本格的なAJAX Webアプリケーションの構築を習得することが目的です。ZendFramework自体を解説する前に、PHPで利用可能な主なフレームワークを紹介します。

PHP用のフレームワーク

日本で比較的人気があるフレームワークには、Ethna、Maple、Piece Framework、Agavi(Mojavi⁠⁠、CakePHP、CodeIgniter、Symfony、Zend Frameworkがあります。これらのフレームワークの現状を簡単にまとめたものが表1です。順序に意図はありません。国産フレームワークとそれ以外に分け、アルファベット順に記載しました。ZendFrameworkを除き、安定版バージョンは2008/9/4時点[1]でのバージョンです。PHP4もサポートしているフレームワークは比較的古くから開発されているフレームワークです。ZendFrameworkは、これらのフレームワークの中でも最も新しく開発されたフレームワークの一つと言えます。

表1 主なフレームワークの状態
Ethna

国産フレームワーク。2.5.0はUTF-8に対応し、文字エンコーディングへの依存を解消。

 - 仕様PHP4/5対応
 - ライセンスBSDライセンス
 - URLhttp://ethna.jp/
 - 最新安定版2.3.5(2008/05/08⁠⁠ 約0.5MB
 - 最新版2.5.0 preview1(beta) ⁠2008/07/05)
Maple

国産フレームワーク。PHP4にも対応したバージョンの開発は停止している。作者に確認した所、PHP5対応のMapleの開発をドキュメント関係から着手している状況。

 - 仕様PHP4/5対応
 - ライセンスPHPライセンス
 - URLhttp://kunit.jp/maple/
 - 最新安定版3.2.0(2006/12/17⁠⁠ 約0.8MB
Piece Framework

国産フレームワーク。ページ状態を維持する事が特徴のフレームワーク。Eclipseにも対応。

 - 仕様PHP4/5対応
 - ライセンスBSDライセンス
 - URLhttp://piece-framework.com/
 - 最新安定版1.5.0(2008/09/04⁠⁠ 約0.4MB
Agavi

Mojaviの後継とされるフレームワーク。2008/08/31にAgavi 2.0.0 beta 2がリリース。

 - 仕様PHP5対応
 - ライセンスLGPLライセンス
 - URLhttp://www.agavi.org/
 - 最新安定版0.11.2(2008/08/31⁠⁠ 約11MB
 - 最新版1.0.0 beta2(2008/08/31)
CakePHP

Railsの影響が強く見られるフレームワーク。設定よりも規約を優先し記述するコード量を削減。

 - 仕様PHP4/5対応
 - ライセンスMITライセンス
 - URLhttp://cakephp.org/
 - 最新安定版1.1.19.6305(2008/01/01⁠⁠ 約1.3MB
 - 最新版1.2.0.7296 RC2(2008/07/27)
CodeIgniter

軽量なフレームワークで初期状態からほとんど設定無しでアプリケーションの構築が可能。

 - 仕様PHP4/5対応
 - ライセンスApache/BSDスタイル
 - URLhttp://codeigniter.com/
http://codeigniter.jp/(日本CodeIgniterユーザ会)
 - 最新安定版1.6.3(2008/07/26)約1.6MB
Symfony

Mojavi3から派生。ほかのプロジェクトの成果を積極的に取り入れているフレーワーク。ほかのプロジェクトのライブラリ等を広く利用している。

 - 仕様PHP5対応
 - ライセンスMITライセンス
 - URLhttp://www.symfony-project.org/
 - 最新安定版1.1.1(2008/06/26⁠⁠ 約12MB
ZendFramework

アプリケーションのディレクトリに特定の構造を想定していない、各モジュールの独立性が高く単体でも利用可能というライブラリ的な要素が強いフレームワーク。

 - 仕様PHP5対応
 - ライセンスPHPライセンス
 - URLhttp://framework.zend.com/
 - 最新安定版1.7.0(2008/11/18⁠⁠ 約19MB

ライセンスは本体のライセンスのみ記載しています。バンドルされたライブラリを持つフレームワークには複数のライセンスが摘要される場合があります。必ず読者自身でライセンスを確認してください。

リリース時期からも分かるように、各フレームワークの開発は精力的に行われていることが分かります。例外はMapleですが、Mapleの作者(kunit氏)によると、PHP5に対応したフレームワーク開発の準備を行っているとのことでした。国産3大フレームワークのEthna、Maple、Piece Frameworkも健在です。

これらすべてのフレームワークは、MVCパターン、ORMまたはDBオブジェクト、バリデーション等、フレークワークに欠かせない機能が実装されています。Zend FrameworkにもMVCパターンを実装するためのフレームワークが用意されています。

これらのフレームワーク以外にも沢山のPHP用フレームワークが開発されています。紹介しきれなかったフレームワークの名前とURLです。これらのフレームワークも比較的人気が高いフレームワークです。これらのフレームワークは2008年にリリースを行っており、メンテナンスされていると考えてよいでしょう。

表2 その他のフレームワーク
名前PHPURL
Akelos PHP4/PHP5http://www.akelos.org/
eZ ComponentsPHP5 http://ez.no/jp/ezcomponents
Fusebox PHP4/PHP5http://www.fusebox.org/
PHPDevShell PHP5 http://www.phpdevshell.org/
PhpOpenbiz PHP5 http://www.phpopenbiz.org/jim/
Prado PHP5 http://www.pradosoft.com/
ProjectZero PHP5 http://www.projectzero.org/
QPHP PHP4/PHP5http://qphp.net/
Seagull PHP4/PHP5http://seagullproject.org/

これだけ沢山のフレームワークがあると、どのフレームワークを選べばよいのか分からなくなります。ビジネスで利用するフレームワークを選択する場合、そのフレームワークのメンテナンスが十分長く継続されることを期待できるかは非常に重要なポイントになります。

ZendFrameworkは、PHP言語コアのZendエンジンを開発したZend社が開発しています。Zend社はIBM、Microsoftとも提携しています。IBMが独自に開発しているsMash(ProjectZero)にもZendFrameworkを利用できます。ZendFrameworkはIBMが開発をサポートしているDojo AJAXフレームワークをサポートしています。ZendFrameworkは比較的長期のメンテナンスが期待できるオープンソースプロジェクトです。

フレームワークとテンプレートエンジン

最近のフレームワークの傾向としては、テンプレートエンジンが用意されていないものが増えてきています。ZendFrameworkも独自のテンプレートエンジンを持たないフレームワークとしてリリースされました。PHPの場合、次のサンプルコードのように言語自体がテンプレートエンジンのようなものであり、出力バッファが組み込まれていることもあり、テンプレートシステムの必要性が低いからです。

PHP本体の機能によるテンプレート化
<html>
<title><?= h($title)?></title>
<body>
<h1>My book list</h1>
<?php foreach($rows as $row): ?>
  <h2><?= h($title)?></h2>
  <p><?= h($review)?></p>
  <hr />
<?php endforeach;?>
</body>

コードの解説

h()はhtmlentities関数等のラッパー関数です。⁠<?=⁠⁠<?php echo⁠と同じですが、php.iniでshort_tagが有効に設定されていないと利用できません。現在、⁠<?=⁠を常に有効化する議論が行われています。実現した場合、⁠<?=⁠の利用が一般的になるでしょう。

PHPの開始タグには<?php、<?、<%、<script language="php">が利用でき、開始タグとechoが一緒になった<?=と<%=が利用可能です。

DojoがバンドルされたZendFramework 1.6.0から、DojoのGUIコンポーネントをサポートするヘルパーも追加されました。一般にテンプレートと呼ばれるシステムは持っていませんが、AJAXアプリケーションを作るためのサポート機能は持っています。Smarty等の既成のテンプレートシステムを組み込むことも簡単です。

PHP以外の言語のフレームワークの場合、テンプレートエンジンにキャッシュ機能を持たせていることが多いです。PHPの場合、出力バッファがPHP本体に組み込まれているので、テンプレートエンジンが無くても簡単にキャッシュ機能を実装できます。テンプレートエンジンを使っても高速に動作させることも可能ですが、シンプルさや動作速度を重視してテンプレートエンジン無しのフレームワークが増えています。

PHP5用フレームワークの将来

PHP5がリリースされてから丸4年が過ぎ、PHP4のメンテナンスが終了ました。新規開発ではPHP4もサポートするフレームワークを選択するメリットは少なくなりつつあります。現在、PHP5とまだリリースされていないPHP6が開発中です。PHP 5.2が安定板としてリリースされています。次のリリースとしてPHP5.3も開発中で、アルファ版がリリースされています。

今後PHP5用のフレームワークは、PHP 5.3以上とPHP 5.3未満の2種類が存在するようになると予想されます。PHP 5.3には名前空間のサポートやバイトコードキャッシュを利用した場合と利用しない場合のスクリプト実行の整合性維持、定数置換によるバイトコード最適化、クロージャサポート、レイトスタティックバインディング[2]等、フレームワーク開発者が必要としていた機能が追加されています。PHP 5.3用のフレームワークが登場し、実用となるまでには1年以上の期間が必要と思われますが、PHP 5.3.0 Alpha版のリリースにより今年あたりから動きが見られると考えられます。

Zend Framework

Zend FrameworkはPHP5用のフレームワークとして開発されました。現在までに1.0、1.5、1.6、1.7までリリースされています。1.0のリリース以降、短い間隔で多くのリリースが公開されていますが、各バージョンの互換性は比較的高く移行は比較的容易です。

ZendFramework主な機能
MVCパターン、PHP5対応、コード生成、キャッシュ、AJAX(Dojo、JQuery⁠⁠、国際化、全文検索、PDF生成、DBアクセスの抽象化

Zend FrameworkはAJAXライブラリとしてDojoをバンドルしています。DojoはAJAXライブラリと言うよりAJAXフレームワークと呼ぶに相応しいものになっています。ハッシュ関数から画面制御のコンポーネントまで多くの機能を提供しています。

Zend Framework 1.7には便利な機能であるFirePHPサポートが追加されています。FirePHPとはAJAXアプリケーション開発に欠かせないFirefox拡張であるFirebugコンソールに簡単なPHP関数呼び出しログを出力する機能です。FirePHPのサポートによりZend FrameworkからもFirebug Consoleにログファイルを送ることが可能となります。

ZendFrameworkは、それぞれのコンポーネントの独立性を重視する設計を採用しています。バリデータだけ使う、キャッシュだけ使う、ログだけ使う、といった感じで特定のコンポーネントだけ使うことが可能になっています。Webアプリケーションを構築する際も、アプリケーションのディレクトリ構成を想定しておらず、ディレクトリ構造は自由に設計できます。このため、Zend Frameworkはフレームワークと言うよりライブラリと言ったほうが相応しいとされてきました。

Zend Framework 1.6からスケルトンコードの自動生成を行うZend Toolが追加されました。zfコマンドが追加され、プロジェクト、アクション等のスケルトンコード作成が可能なりました。1.0の頃のZendFrameworkのMVCコンポーネントはデフォルト値が設定されていなかったので、コントローラ、ビュー、モデル等の格納場所を設定する必要がありました。現在のZendFrameworkはデフォルト値が設定されたので、デフォルト通りであれば設定する必要がなくなりました。

Zend_Framework1.5.0までの弱点は、AJAXサポート、スケルトンコードの自動生成、ORM機能でした。AJAXサポートはDojo、JQueryのサポートで大幅に改善しました。コード生成機能はまだごく基本的な機能しかサポートしていませんが、1.6.0から追加されました。ORM機能の強化はされていません。ZendFrameworkのORM機能には改善の余地が多くありますが、残念ながらレイトスタティックバイディングがサポートされるPHP 5.3まで大きく改善されることはあまりないと予想できます。

ZendFramework 1.6.0/1.7.0

ZendFramework 1.6.0と1.7.0は2か月半ほどしかリリース間隔が無かったので、新機能をまとめて紹介します。

  • Dojoとの統合
    • JSON-RPC
    • dojo.data エンベロープ
    • Dojo View Helper
    • DijitとZend_Form/Zend_Viewとの統合
  • JQeuryサポート
  • SOAP
    • SOAPサーバ/クライアント
    • オートディスカバリ
    • WSDLアクセス/ジェネレーション
  • コマンドラインインターフェース(Preview)
  • プロジェクト資産管理(Preview)
  • I18N機能の強化
  • ファイル受信機能の強化
  • AMF0とAMF3のサポート(Adobe AIR、Flashサポート)
  • Tiwtterサポート
  • Lucene 2.3インデックスフォーマット
  • Captchaフォームエレメント
  • Zend_Wildfireコンポーネント(Firebugログライター)
  • Media Viewヘルパ(Flash、Quicktime、Objectとページ)

ZendFramwork 1.6.0/1.7.0で最も大きな変更はDojoとの統合です。Zend Frameworkは1.0、1.5とリリースされてきましたが、1.5でフォームコンポーネントにAJAXサポートが追加された程度でした。Dojoとの統合によりダイナミックなページの生成が容易になりました。また、AJAXアプリケーション開発に欠かせないFirebugへログが出力できる機能も追加され、AJAXアプリケーション開発も容易になりました。

ZendFrameworkとPHPの今後

今年、安定板のPHP 5.3はリリースされます。PHP 5.3は名前空間、クロージャ、レイトスタティックバインディング、国際化機能の大幅な強化など、フレームワーク開発者にとって利用価値の高い言語仕様変更や機能追加が行われています。ZendFrameworkにもこれらのPHPの新機能が利用され、新しいZendFrameworkがリリースされるでしょう。しかし、PHP5.3の機能を活用したZend Frameworkのリリースは早くても2010年からになるでしょう。

本連載について

この連載では、Zend Frameworkを利用する環境から本格的なAJAXアプリケーションの構築までを紹介します。最初は非常に単純なアプリケーションから始めますが、最終的には本格的なブログアプリケーションの構築まで行う予定です。

次回はZend Frameworkを利用する環境を整えます。

おすすめ記事

記事・ニュース一覧