最近、ほとんどのWeb開発者のように、私はWebアプリケーションやサイトのための強固なMVCアーキテクチャの恩恵を享受しています。 PHPでMVCを行うとき、オートローディングは明らかに非常に便利です。効率的なPHPの自動ロードと命名の戦略
__autoload()
という機能を定義するだけで、私はspl_autoload_register
のファンになりました。これは、独自のオートローディングを使用する異なるベースモジュールを組み込んでいる場合は明らかです。しかし、私が書いたローディング関数については、決して素晴らしいことはありませんでした。可能なクラスをロードするために、多くの文字列チェックとディレクトリスキャンが必要です。
たとえば、のは、私がPATH_APP
として定義された基本パスを持っているアプリ、およびmodels
、views
とcontrollers
を指定されたディレクトリを持つ単純な構造を有しているとしましょう。私はしばしばファイル名がIndexView.php
とIndexController.php
という適切なディレクトリ内にあり、モデルには一般的にはデフォルトで特別なスキームはないという命名構造を採用しています。それはその後に発見されていない場合、私はモデルのディレクトリにサブディレクトリをスキャンするために別の機能を持っているかもしれません
public function MVCLoader($class)
{
if (file_exists(PATH_APP.'/models/'.$class.'.php')) {
require_once(PATH_APP.'/models/'.$class.'.php');
return true;
}
else if (strpos($class,'View') !== false) {
if (file_exists(PATH_APP.'/views/'.$class.'.php')) {
require_once(PATH_APP.'/views/'.$class.'.php');
return true;
}
}
else if (strpos($class,'Controller') !== false) {
if (file_exists(PATH_APP.'/controllers/'.$class.'.php')) {
require_once(PATH_APP.'/controllers/'.$class.'.php');
return true;
}
}
return false;
}
:私はspl_autoload_register
に登録されます。このように、この構造のためのローダ機能を持っているかもしれません。しかし、if/elseing、文字列のチェックとディレクトリスキャンはすべて私にとっては非効率的だと思うので、私はそれを改善したいと思います。
他の開発者が採用している可能性のあるファイル命名方法とオートロード方法は非常に不思議です。私は、効率的なオートローディングのための優れたテクニックを特に探しています。オートローディングの代替方法ではありません。
寒さのためのポンド+1 – Louis
確かにアンダースコアアプローチが好きです。これは、クラスツーファイル変換をより効率的にします。 – zombat
'$ files'配列の周りに' array_unique() 'をラップします。クラス名にアンダースコアがない場合は、各ファイルを2回試してみます。 – mpen