PHPの代表的なフレームワークの1つであるsymfonyについてまとめます。元ネタはsymfonybook-ja1.0です。
覚えておくべき基本的な手法
symfonyでよく使われるいくつかの手法があります。例えば、パラメーターホルダー、定数、そしてクラスのオートロードなどです。
パラメーターホルダー
symfonyの多くのクラスはパラメーターホルダー(parameter holder)を実装しています。これはゲッターとセッターメソッドを持つプロパティ(属性、メンバ変数)をカプセル化するのに役立ちます。たとえば、sfResponseクラスはgetParameterHolder()メソッドを呼び出すとパラメーターホルダーオブジェクトを取得することができます。このパラメータホルダーを使用することで各プロパティにアクセスできます。
1 2 3 4 |
//sfResponseクラスのパラメーターホルダーを使う $response->getParameterHolder()->set('foo', 'bar'); echo $response->getParameterHolder()->get('foo'); => 'bar' |
パラメーターホルダーを使う多くのクラスはget/setメソッドが短く記述できるプロキシ(proxy)メソッドを使うことができます。
1 2 3 4 |
//sfResponseパラメーターホルダーのプロキシメソッドを使う $response->setParameter('foo', 'bar'); echo $response->getParameter('foo'); => 'bar' |
パラメーターホルダーのゲッターは第2引数にデフォルト値を指定することができます。いちいち条件文でエラー処理を記述する手間が省けます。簡単にフォールバックメカニズム(障害が起きても最低限の機能を維持するメカニズム)を実装することができます。実際の使い方は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 'foobar' パラメーターは定義されていないので、ゲッターは空の値を返す echo $response->getParameter('foobar'); => null // デフォルト値はゲッターを条件文に設置することで利用可能 if ($response->hasParameter('foobar')) { echo $response->getParameter('foobar'); } else { echo 'default'; } => default // しかしそれに対してゲッターの第2引数を利用するほうがはるかに速い echo $response->getParameter('foobar', 'default'); => default |
定数
symfonyでは定数を扱う場合、sfConfigと呼ばれる独自の設定オブジェクトを使用します。このオブジェクトはどこからでもパラメーターをアクセスできる静的なメソッドを提供します。sfConfigクラスのメソッドの使用法は以下の通りです。
1 2 3 4 5 6 7 |
//PHPでは定数を以下のように定義して使用する define('SF_FOO', 'bar'); echo SF_FOO; //symfonyではsfConfigオブジェクトを使う sfConfig::set('sf_foo', 'bar'); echo sfConfig::get('sf_foo'); |
クラスのオートロード
通常、PHPでクラスを使う場合、まずクラスの定義をインクルードする必要があります。
1 2 |
include 'classes/MyClass.php'; $myObject = new MyClass(); |
しかし、多くのクラス、深いディレクトリ構造を持つプロジェクトにおいて、すべてのクラスのファイルとそれらのパスを追跡するにはあまりにコストがかかりすぎます。symfonyはspl_autoload_register()関数によって、includeステートメントを記述しなくてもいきなりクラスを使うことができます。
1 |
$myObject = new MyClass(); |
symfonyはプロジェクト配下のlib/ディレクトリに存在する拡張子.phpで終わるファイル内でMyClassの定義を探します。クラスの定義が見つかるとファイルは自動的にインクルードされます。
全てのクラスをlib/ディレクトリに保存した場合はクラスをインクルードする必要がなくなります。このような仕組みにより、symfonyのプロジェクトは通常includeステートメントもしくはrequireステートメントを必要としません。
symfonyのオートロード機能は最初のリクエスト時に、設定ファイルで指定されたディレクトリのリストをスキャンします。symfonyはこれらのディレクトリが含む全てのクラスを登録し、クラス/ファイルを連想配列として保存(キャッシュ)します。この方法によって、今後のリクエストではディレクトリのスキャンは行われず、パフォーマンスの向上につながります。ただし、クラスファイルをプロジェクトに追加もしくは移動させた場合は、symfony clear-cacheコマンドでキャッシュをクリアしてクラスの登録状態を最新にする必要があります。