2010-11-20 15 views
0

私はオートローダーを使用してクラスを組み込みます。私が今やっていることは、 "glob"を使って別のディレクトリを読み込んで配列にプッシュすることです。これにはより良い解決策がありますか?遅延クラスにはPHPが含まれています

$path = './'; 

$files = array_merge(
glob($path.'includes/classes/system/*.class.php'), 
glob($path.'includes/classes/system/baseclasses/*.class.php'), 
glob($path.'includes/classes/system/systementities/*.class.php')); 

EDIT:

私は自動ロードクラスの内部でこれを使用しています。問題は、globでファイルを検索する必要があることです。これを行うより速い方法がありますか?

答えて

1

PHPに知られていないクラスを使用しようとすると、いつでもオートローディングがトリガーされます。 include/requireを使用すると、PHP.iniのinclude_pathで指定したすべてのディレクトリがPHPによって処理されるため、globを使用する理由はありません。あなたのケースでは、class2file mapを使用することですファイルをインクルードするinclude_path

/path/to/includes/classes/system/ 

最速方法を設定するのに十分であるべきです。ただし、このようなマップを作成し、アプリケーションの変更時にはそのマップを更新したままにする必要があります。

+0

しかし、ここでも私はファイルが必要です。したがって、上記のコードは変更されません。私はすでにspl_autoload_registerを使用しています(タグが公開されているように) – Simon

+0

"私はファイルが必要です"とはどういう意味ですか?インクルードパスの検索が遅いと考えてマップが必要な場合は、どのような戦略を使用してマップを生成し、どこかにキャッシュすることを検討してください(シンプルファイル、APC、memcache)。 – timdev

+0

音が良くて、試してみるよ! – Simon

1

PHPはすでにこの問題を解決しています。 PHPのbuilt-in autoloaderを使用してください。言語/フレームワークがあなたのために提供するときは、自分のロールを決してしないでください。

0
function __autoload($class) { 
    $classfile = $class.'.class.php'; 
    $path = './includes/classes/system/'; 
    if (is_file($path.$classfile)) require_once($path.$classfile); 
    if (is_file($path.'baseclasses/'.$classfile)) require_once($path.'baseclasses/'.$classfile); 
    if (is_file($path.'systementities/'.$classfile)) require_once($path.'systementities/'.$classfile); 
} 

...これはまだ最大の方法ではありませんが、glob()を使用して周りを回ります。あなたのシステムのすべてを一般的に読み込んでいるなら、ブート/設定スクリプトにハードコードされたrequire()リストがなければなりません。クラスファイルの整理方法やフェッチ方法には多くのオプションがあります。スクリプトの検索時間を短縮するために、ファイルツリーをインターフェイスとして考えることができます。簡単にするために、必須ではないすべてのクラスを同じフォルダに入れて、is_file()呼び出しを1つに減らすことができます。

私のシステムでは、それぞれの制御スクリプトとビューでフォルダにグループ分けされたオブジェクトクラスがあります。私の__autoload()関数は簡単な仕事をしています -

$classfile = $path.$class.'/'.$class.'_class.php'; 
if (is_file($classfile)) require_once($classfile); 
+0

ファイルを格納するシングルトンクラスを使用するので、is_fileチェックの代わりにissetチェックを行うだけです – Simon

関連する問題