パスエイリアスと名前空間

Yiiは広範囲に渡るパスエイリアスを使用します。パスエイリアスは、特定の ディレクトリ、またはファイルパスと結びつけられます。これは、広範囲に 採用されている名前空間のフォーマットに似たドットシンタックスによって 表されます:

RootAlias.path.to.target

RootAliasの部分は現存するディレクトリへのエイリアスです。

YiiBase::getPathOfAlias()を使うことより、エイリアスは対応するパスへ変換されます。 例えば、system.web.CControlleryii/framework/web/CControllerのように変換されます。

また、YiiBase::setPathOfAlias()を用いて、新しいルートパスエイリアスを定義することができます。

1. ルートエイリアス

便宜上、Yiiは以下のルートエイリアスをあらかじめ定義しています。

  • system: Yiiフレームワークのディレクトリを参照します。
  • zii: Zii libraryディレクトリを参照します。
  • application: アプリケーションのbase directoryを参照します。
  • webroot: entry scriptファイルを含むディレクトリを参照します。
  • ext: すべてのサードパーティextensionsを含むディレクトリを参照します。

さらに、もしアプリケーションがmodulesを使用している場合は、 それぞれのモジュールは、モジュールIDと同じ名前を持ち、モジュールのベースパスを参照するあらかじめ定義されたロートエイリアスを持ちます。 例えばもしアプリケーションがモジュールIDがusersであるようなモジュールを使用する場合、usersという名前のルートエイリアスはあらかじめ定義されます。

2. クラスのインポート

エイリアスを使用するにあたり、クラスの定義を含めることは非常に便利です。 例えば、CControllerクラスを含める場合、以下のように呼び出します。

Yii::import('system.web.CController');

import メソッドはより効率的という点で includerequire とは違います。インポートされるクラスの定義は、厳密には、 それが始めて参照されるときまでインクルードされません。同じ名前空間が 何度もインポートされる場合においても、include_onderequire_once よりも断然早いのです。

ヒント: Yiiフレームワークで定義されたクラスを参照する場合、 インポートやインクルードを行う必要はありません。Yiiの全てのコアクラスは、 あらかじめインポートされています。

クラスマップを使う

1.1.5版からはYiiコアクラスにも使用されているクラスマッピング機構を、あらかじめユーザクラスをインポート するために使用可能になりました。 あらかじめインポートされたクラスはYiiアプリケーションのどこでも明にインポート/インクルードせずに使用可能です。 この特徴はYiiの上に構築するフレームワークやライブラリとって最も有用です。

クラスをあらかじめインポートするには、CWebApplication::run()が起動されるまえに以下のコードを実行する必要があります。

Yii::$classMap=array(
    'ClassName1' => 'path/to/ClassName1.php',
    'ClassName2' => 'path/to/ClassName2.php',
    ......
);

3. ディレクトリのインポート

下記のシンタックスによって、ディレクトリ配下のクラスファイルが、必要な時に 自動的にインクルードされるように、ディレクトリ全体をインポート する事が出来ます。

Yii::import('system.web.*');

importの他にも、エイリアスはクラスを参照する為に、 様々な箇所で使用されます。例えば、もしクラスファイルが予めインクルード されていない場合でも、クラスに結びついたインスタンスを作成する為に、 エイリアスをYii::createComponent() に渡すことが出来ます。

4. 名前空間

名前空間は、クラス名の論理的なグループを参照する事によって、たとえクラス名が同じでも、 他の名前空間のものとは別に識別する為のものです。 名前空間とパスエイリアスで混乱しないで下さい。 パスエイリアスはファイルやディレクトリの名前をつける便利な手法ではありません。それは 名前空間とは無関係です。

ヒント: PHP 5.3.0よりも以前のバージョンでは名前空間のサポートが 本質的に無いので、同じ名前のクラスのインスタンスを作成することが 出来ない為、異なる定義を行う必要があります。この理由によって、 全てのYiiフレームワークのクラスは、前置詞として'C'('class'を意味します) を付随させていて、この事によって、ユーザーが定義したクラスと識別が 出来るようになっています。前置詞'C'はYiiフレームワークの使用の為に リザーブしておき、ユーザー定義によるクラスの前置詞には別の文字列を 使用して下さい。

5. 名前空間化クラス

名前空間化クラスはグローバルでない名前空間において宣言されるクラスを意味します。 例えば、application\components\GoogleMapクラスはapplication\components名前空間で宣言されます。 名前空間化クラスはPHP5.3.0かそれ以上が必要です。

1.1.5版からは名前空間化クラスを明に宣言することなしに使用可能になりました。 例えば、application\components\GoogleMapの新しいインスタンスを作成する場合に対応するクラスファイルを 明にインクルードしなくても良くなりました。これはYiiの自動クラスロード機構を拡張するものです。

名前空間化クラスを自動ロードするためには、名前空間はパスエイリアスと似たような名前付けをされている必要があります。 例えばapplication\components\GoogleMapapplication.components.GoogleMapとしてエイリアスされるファイルに格納される必要があります。

$Id: basics.namespace.txt 3086 2008-11-06 19:43:44Z qiang.xue $

Be the first person to leave a comment

Please to leave your comment.