定義されたパスのセットを検索するような方法で PHP のオートローダー機能を活用するにはどうすればよいでしょうか?
質問
オートローダーを使用する場合の欠点の 1 つは、どこを見ればよいかわからないことです。私のフレームワークには、すでに約 15 の異なるディレクトリに約 70 のクラスがあります。そのため、私は自動ロードを選択せず、代わりにパスの生成に苦労しました。したがって、ルートファイルから行きたい場所までのパスを提供する連想パス配列があります。効果はありますが、本当に苦痛になってきました。
まず、私のフレームワークのユーザーは、クラスがどこに存在するのかほとんどわからないでしょう。そのため、FormViewController を作成するのは、それを含めるためのパスが必要なだけですでに面倒です。
最初は、PHP がファイルを自動ロードするときに、複数のディレクトリを介してファイルを「検索」する必要があるとしても問題ないと思います。だから何?PHP がそうすれば、私たちの多くの苦痛が軽減されます。しかし、それを最も効率的に行うにはどうすればよいでしょうか?
グローバル コンテキスト オブジェクトから取得した $paths という配列があります。パスは最も合理的な順序で配列内に定義できます。最も頻繁に使用されるパスから始めます。
PEAR ライブラリには、autoloader で system/views/specialviews/SpecialView.php に変換される system_views_specialviews_SpecialView.php のような奇妙な命名規則があることは知っています...しかし、正直に言って、これはひどいです。このようにファイル名を台無しにしたくない。すぐにダメになってしまう独自のクラスを作成する開発者向け。
このタスクの車輪を再発明する前に、誰かがこの問題の解決策を知っているでしょうか?
解決
注意:独自のカスタムオートローダーを作成していると思います spl_autoload_register, 、など。
オートローダーを作成していて、含めようとしているクラスが 15 の異なるディレクトリに分散している場合、ディレクトリ パスへの何らかの形式のクラス名マッピングの使用を避ける方法がわかりません。ただし、これは明らかにそうではありません。引用した例ほど深くする必要はありません。
単純なレベルでは、すべてのシステム ライブラリを 1 つの領域に保存すると、大文字と小文字が自動的に一致します。
switch(true) {
case substr($className, 0, 6) == 'System': { $libraryPath = 'xxx'; break; }
...
}
...手動で確認する必要があるパスの数によって明らかに異なりますが、これはかなり効率的なアプローチであるはずです。
さらに、自動ロードを試みる前にクラスの存在をチェックしていると思いますか?(つまり:class_exists($className) を実行して、既に組み込まれていないことを確認します。) また、この要件は、オブジェクトを再利用する頻度によって異なります。
他のヒント
が見たいと思い Netteの枠組みのRobotLoader.
基本的な考え方でスキャンを通じてディレクトリのご指定を解析し .php
(token_get_all
)ファイルをいていくつかの提案を行なっているファイルのクラス/インタフェース位置のクラスとインタフェースはキャッシュで速い。ローダーに登録 spl_autoload_register()
時PHP通訳はできなかのクラスでのローダー tryLoad()
方法。
私はあなたがこれをすでに知っていると確信しているが、念のために、あなたは__autoload()
を(書くことができます<のhref =「http://php.net/manual/en/language.oop5.autoload.php」のrel =あなたが望むことをすべての基準に基づいて、あなたのディレクトリを検索し、あなたのフロントコントローラ(またはそれによって含まれるすべてのファイルの中のパラメータとしてクラス名を取り「nofollowをnoreferrer」> API の)機能)。あなたが行うすべては、あなたがそれを見つけたらrequire_once
正しいファイルである、またはクラス名が有効でない場合は、例外をスローします。
あなたの説明から、私はあなたがこれをやっていたという兆候を取得できませんでした。あなただけのPHPのは扱いにくいグローバル配列内の値を使用してパスを含める追加されているように思えます。
PHPオートローダにしたいすべてを行います。あなたが別の場所を持っている場合は、単に各クラスパスのためのオートローダの複数のインスタンスを作成する必要があります。
最初の検索は、いくつかの知性で行われることを除いては、前述のようにRobotLoader同じことをしそうです。クラス名の下レーベンシュタイン距離を持つファイルは、潜在的なクラス定義として好まれています。しかし、これは、インデックスのない最初の検索にのみ関連します。