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

Yiiは、必要となるすべてのクラスファイルを、特定してインクルードするにあたり、 クラスのオートローディングメカニズム を頼りにします。PSR-4 標準 に準拠した、高性能なクラスのオートローダーを提供します。 このオートローダーは、あなたが Yii.php ファイルをインクルードするときにインストールされます。

補足: 説明を簡単にするため、このセクションではクラスのオートローディングについてのみお話しします。しかし、 ここに記述されている内容は、同様に、インタフェースとトレイトのオートロードにも適用されることに注意してください。

Yii オートローダーの使用

Yii のクラスオートローダーを使用するには、自分のクラスを作成して名前を付けるとき、次の2つの単純なルールに従わなければなりません:

  • 各クラスは名前空間の下になければなりません (例 foo\bar\MyClass)
  • 各クラスは次のアルゴリズムで決定される個別のファイルに保存されなければなりません:
// $className は先頭にバックスラッシュを持つ完全修飾名
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');

たとえば、クラス名と名前空間が foo\bar\MyClass であれば、対応するクラスファイルのパスの エイリアス は、 @foo/bar/MyClass.php になります。このエイリアスがファイルパスになるようにするには、@foo または @foo/bar のどちらかが、 ルートエイリアス でなければなりません。

Basic Application Template を使用している場合、最上位の名前空間 app の下にクラスを置くことができ、 そうすると、新しいエイリアスを定義しなくても、Yii によってそれらをオートロードできるようになります。これは @app事前定義されたエイリアス であるためで、app\components\MyClass のようなクラス名を 今説明したアルゴリズムに従って、クラスファイル AppBasePath/components/MyClass.php だと解決できるのです。

Advanced Application Template では、各階層にそれ自身のルートエイリアスを持っています。たとえば、 フロントエンド層はルートエイリアス @frontend を持ち、バックエンド層は @backend です。その結果、名前空間 frontend の下に フロントエンドクラスを置き、バックエンドクラスを backend の下に置けます。これで、これらのクラスは Yii のオートローダーによって オートロードできるようになります。

クラスマップ

Yii のクラスオートローダーは、 クラスマップ 機能をサポートしており、クラス名を対応するクラスファイルのパスにマップできます。 オートローダーがクラスをロードしているとき、クラスがマップに見つかるかどうかを最初にチェックします。もしあれば、対応する ファイルのパスは、それ以上チェックされることなく、直接インクルードされます。これでクラスのオートローディングを非常に高速化できます。 実際に、すべての Yii のコアクラスは、この方法でオートロードされています。

次の方法で、 Yii::$classMap に格納されるクラスマップにクラスを追加できます:

Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';

クラスファイルのパスを指定するのに、 エイリアス を使うことができます。クラスが使用される前にマップが準備できるように、 ブートストラップ プロセス内でクラスマップを設定する必要があります。

他のオートローダーの使用

Yii はパッケージ依存関係マネージャとして Composer を包含しているので、Composer のオートローダーもインストールすることをお勧めします。 あなたが独自のオートローダーを持つサードパーティライブラリを使用している場合、それらもインストールする必要があります。

Yii オートローダーを他のオートローダーと一緒に使うときは、他のすべてのオートローダーがインストールされた 後でYii.php ファイルをインクルードする必要があります。これで Yii のオートローダーが、任意クラスのオートローディング要求に応答する最初のものになります。 たとえば、次のコードは Basic Application Templateエントリスクリプト から抜粋したものです。 最初の行は、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 のオートローダーはエクステンションクラスをオートロード可能です。