クラスのオートローディング

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 のオートローダがエクステンション・クラスをオートロードすることが可能です。