クラスのオートローディング ¶
Yiiは、必要となるすべてのクラス・ファイルを特定してインクルードするにあたり、
クラスのオートローディング・メカニズム を頼りにします。
Yii は、PSR-4 標準 に準拠した、高性能なクラスのオートローダを提供しています。
このオートローダは、あなたが Yii.php
ファイルをインクルードするときにインストールされます。
Note: 説明を簡単にするため、このセクションではクラスのオートローディングについてのみ話します。しかし、 ここに記述されている内容は、インタフェイスとトレイトのオートローディングにも同様に適用されることに注意してください。
Yii オートローダを使用する ¶
Yii のクラス・オートローダを使用するには、クラスを作成して名前を付けるとき、次の二つの単純なルールに従わなければなりません:
- 各クラスは 名前空間 の下になければなりません (例
foo\bar\MyClass
) - 各クラスは次のアルゴリズムで決定される個別のファイルに保存されなければなりません:
// $className は先頭にバック・スラッシュを持たない完全修飾クラス名
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');
たとえば、クラス名と名前空間が foo\bar\MyClass
であれば、対応するクラス・ファイルのパスの エイリアス は、
@foo/bar/MyClass.php
になります。このエイリアスがファイル・パスとして解決できるようにするためには、@foo
または @foo/bar
のどちらかが、 ルート・エイリアス でなければなりません。
ベーシック・プロジェクト・テンプレート を使用している場合、最上位の名前空間 app
の下にクラスを置くことができ、
そうすると、新しいエイリアスを定義しなくても、Yii によってそれらをオートロードできるようになります。これは @app
が 事前定義されたエイリアス であるためで、app\components\MyClass
のようなクラス名を
今説明したアルゴリズムに従って、クラス・ファイル AppBasePath/components/MyClass.php
であると解決することが出来ます。
アドバンスト・プロジェクト・テンプレート では、各層がそれ自身のルート・エイリアスを持っています。たとえば、
フロントエンド層はルート・エイリアス @frontend
を持ち、バックエンド層のルート・エイリアスは @backend
です。その結果、名前空間 frontend
の下に
フロントエンド・クラスを置き、バックエンド・クラスを backend
の下に置けます。これで、これらのクラスは Yii のオートローダによって
オートロードできるようになります。
独自の名前空間をオートローダに追加するためには、Yii::setAlias() を使って、その名前空間のベース・ディレクトリに対するエイリアスを定義する必要があります。
例えば、path/to/foo
ディレクトリに配置されている foo
名前空間に属するクラスをロードするためには、`Yii::setAlias('@foo', 'path/to/foo') を呼び出します。
クラス・マップ ¶
Yii のクラス・オートローダは、 クラス・マップ 機能をサポートしており、クラス名を対応するクラス・ファイルのパスにマップできます。 オートローダがクラスをロードするときは、クラスがマップに見つかるかどうかを最初にチェックします。もしあれば、対応する ファイル・パスは、それ以上チェックされることなく、直接インクルードされます。これでクラスのオートローディングを非常に高速化できます。 実際のところ、すべての Yii のコア・クラスは、この方法でオートロードされています。
次の方法で、 Yii::$classMap
に格納されるクラス・マップにクラスを追加できます:
Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';
クラス・ファイルのパスを指定するのに、 エイリアス を使うことができます。クラスが使用される前にマップが準備できるように、 クラス・マップの設定は ブートストラップ プロセス内でする必要があります。
他のオートローダの使用 ¶
Yii はパッケージ依存関係マネージャとして Composer を包含しているので、Composer のオートローダもインストールすることをお勧めします。 あなたが独自のオートローダを持つサードパーティ・ライブラリを使用している場合は、 それらもインストールする必要があります。
Yii オートローダを他のオートローダと一緒に使うときは、他のすべてのオートローダがインストールされた 後で 、 Yii.php
ファイルをインクルードする必要があります。これで Yii のオートローダが、任意クラスのオートローディング要求に応答する最初のものになります。
たとえば、次のコードは ベーシック・プロジェクト・テンプレート の
エントリ・スクリプト から抜き出したものです。
最初の行は、Composer のオートローダをインストールしており、二行目は Yii のオートローダをインストールしています。
require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
あなたは Yii のオートローダを使わず、Composer のオートローダだけを単独で使用することもできます。しかし、そうすることによって、 あなたのクラスのオートローディングのパフォーマンスは低下し、クラスをオートロード可能にするために Composer が設定したルールに従わなければならなくなります。
Info: Yiiのオートローダを使用したくない場合は、
Yii.php
ファイルのあなた独自のバージョンを作成し、 それを エントリ・スクリプト でインクルードする必要があります。
エクステンション・クラスのオートロード ¶
Yii のオートローダは、 エクステンション クラスのオートロードが可能です。唯一の要件は、
エクステンションがその composer.json
ファイルに正しく autoload
セクションを指定していることです。
autoload
の指定方法の詳細については Composer のドキュメント 参照してください。
Yii のオートローダを使用しない場合でも、まだ Composer のオートローダがエクステンション・クラスをオートロードすることが可能です。