私は現在、PHPでフレームワークをプログラミングしています(主に教育上の理由と、時間を渡す方法のため)。そして、ディレクトリツリーを自動的にスキャンしてその中のすべてのクラスを検出し、次の形式で配列を作成するオートローダーを作成しました。
Array(
'MyAwesomeClass' => 'path/to/file/in/some/subdirectory/MyAwesomeClass.php',
'MyOtherAwesomeClass' => 'path/to/file/MyOtherAwesomeClass.php'
// ....
);
最初はこれはとてもきれいでした。クラスをどこに置くか心配する必要がないからです。
しかし、後で私はこれが非常にリソースを大量に消費することを発見しました。そこで、キャッシュメカニズムを作成し、インデックスをシリアル化してファイルに保存しました。これにより、PHPスクリプトの応答時間が少なくとも50%短縮されました。しかし、それはいくつかの問題をもたらしました。
フレームワークの他のクラスでは、私はよく次のようなものを使用します。
class_exists('MyAwesomeClassController');
問題は、新しいクラスを追加した場合MyAwesomeClassController
、そのクラスはまだインデックスに含まれておらず、class_exists
falseを返すことです。問題は、フレームワークに新しいクラスを追加するたびに、キャッシュされたファイルを削除する必要があることです(オートローダーにインデックスを再作成させるため)。
私が試したもう1つのこと(少しハッキーです):Autoloaderクラスで、class_exists()を使用してautoloadメソッドが呼び出されたかどうかを確認しました。この場合、インデックスを再作成して、要求されたクラスがどこかにあるかどうかを確認しました。class_exists
ただし、ほとんど存在しないクラスを使用して呼び出されることがあるため、これもうまくいかないようです。したがって、これは基本的に、すべてのリクエストでインデックスを再作成するのと同じソリューションです。
解決策はありますか?または、オートローダーを完全に書き直す必要がありますか?