以前は、 Composer の自動ロードの原理は、実際には PHP の自動クラス ロード機能を利用しています。
PHP でのクラスの自動ロードは、主に __autoload() と spl_autoload_register() という 2 つのメソッドに依存します。
今日は、これら 2 つの方法の使用法について簡単に説明します。
__autoload()
廃止されつつある魔法のメソッドなので、理解するだけで十分です。このメソッドを PHP7 で使用すると、古い警告が報告され、システムは spl_autoload_register() メソッドの使用を推奨します。
function __autoload($name){ include __DIR__ . '/autoload/' . $name . '.class.php'; } $autoA = new AutoA(); var_dump($autoA);
AutoA クラスをインスタンス化すると、現在のファイルにはこのクラスがなく、他のファイルをインクルードしたり、他のファイルから要求したりすることもありません。このとき、自動的にマジック メソッド __autoload() に入ります。 __autoload() メソッドには、このクラスが配置されているファイルを含めるだけで済みます。
spl_autoload_register()
このメソッドは現在、上記のマジック メソッドによるクラスの自動ロード機能を置き換えています。これは spl 拡張ライブラリのメソッドであり、spl 拡張ライブラリはデフォルトで PHP に統合されているため、安心して直接使用できます。
spl_autoload_register() の __autoload() に対する利点は、__autoload() を登録でき、__autoload() キューを実装および維持できることです。当初はファイル内に __autoload() メソッドは 1 つしか存在できませんでしたが、現在ではキューが存在します。
この方法では、すべての読み込みコードを 1 つの __autoload() メソッドで記述する必要はなく、複数の spl_autoload_register() を使用して各クラスを個別に読み込むことができます。
spl_autoload_register(function($name){ include __DIR__ . '/autoload/' . $name . '.class.php'; }); $autoA = new AutoA(); var_dump($autoA);
参考: Composer 原則の詳細な検討 (2)
include または include_once を使用する
自動読み込みでは、使用する必要があるのはinclude を指定すると、クラスは繰り返しロードされません。
spl_autoload_register(function($name){ include __DIR__ . '/autoload/' . $name . '.class.php'; echo $name, PHP_EOL; }); $autoA = new AutoA(); var_dump($autoA); $autoA = new AutoA(); var_dump($autoA); $autoA = new AutoA(); var_dump($autoA); $autoB = new AutoB(); var_dump($autoB);
コードから、クラスが複数回インスタンス化される場合、$name は 1 回だけ出力されることがわかります。したがって、クラス ファイルの繰り返しロードの問題を心配する必要はありません。さらに、大規模なフレームワークで Composer を使用する場合、多くのクラスがロードされるため、_once メソッドによって効率の問題も発生します。