質問
私は、オートローディングのためのPHPでこのクラスを使用しています。 http://pastebin.com/m75f95c3bする
しかし、私はどこかに持っているとき、
class Bar extends Foo
そして、私はそれがクラスを見つけることができませんfoo.class.phpと呼ばれるファイルを持っています。 しかし、私はそれがクラスを見つけるでしょうFoo.class.phpするファイル名をchagneときます。
私はそのそこにあれば、常にファイルを見つけるために、私のクラスにファイル名が資本で始まるかどうか天気を関係なく、いくつかのfunctionallityを追加しようとしています。しかし、これまでのところ、私はscuceededしていません。
誰ですか?
解決
ガンボのソリューションは、最高の一つであり、それはほとんどの人が使用するものです。あなたが好きではない理由を私は理解していません。もちろん、ファーストクラスの名前のファイルが存在するか、そうでない場合、その後小文字バージョンが存在するかどうかをチェック大文字かどうかを確認することができます。それは間違いなくガンボのソリューションよりも優れていないのです。結局のところ、「あなた」のプログラマは、いくつかの規約/ルールに従う必要があります。
他のヒント
あなたのファイルのすべてが小文字の名前を持っている場合は、あなたのクラスの各メソッドにstrtolower
変数の値に$className
を適用します:
$className = strtolower($className);
しかし、私はあなたがすべての開発者がに固執しなければならないいくつかのコーディングガイドラインの草案を作成することを示唆しています。そうでなければ、大文字と小文字を使用してファイル名を書くの2 の<ファイル名の長さ> のの可能性のそれぞれをテストする必要があります。
私は、多かれ少なかれ、このようにそれを行うだろう。
function __autoload($class_name) {
$upperName = strtoupper(substr($class_name,0,1)) . substr($class_name, 1);
$lowerName = strtolower(substr($class_name,0,1)) . substr($class_name, 1);
//Check to see if the class file exists as-is
if(file_exists($class_name . '.php')) {
require_once($class_name . '.php');
}elseif(file_exists($upperName . '.php')) {
require_once($upperName . '.php');
}elseif(file_exists($lowerName . '.php')) {
require_once($lowerName . '.php');
}else {
throw new Exception("The class $class_name could not be found.");
}
}
これは、異なる命名規則が発生するように、他の条件文を追加するために十分に簡単です。
私は、以前の開発者との下位互換性を提供するために、アカウントに、いくつかの異なるファイル命名規則をとる__autoload()関数を使用します。
これは、各大会の上に単純なループを実行して、そのファイルが存在するかどうかを確認します。ファイルが存在する場合、それは、それをロードします。
私の機能のために、私はそのようなの.inc、.classファイルまたは.inc.phpなど、さまざまなファイル拡張子、のためにこれを行います。あなたは同じことを行うが、上下の最初の文字を検索できます。
私は、コメントとそれ以外の部分に「ファイルを検出した」searchForClassFile()メソッドでこれを入れてしまうでしょう。
EDIT(詳細):
再帰的に正しいファイルを探して、クラスのディレクトリに降りするのではなく、私は特定の場所にクラス名をマッピングします。これは一般的な方法です。例えば、foo_bar
は[CLASS_DIRECTORY]/foo/bar.[EXTENSION]
にマッピングされます。私たちのケースでは、我々はいくつかの異なる拡張子を確認ます。
あなたのケースでは、あなたは、クラスファイルを検索する方法についての設計上の決定をしなければならないが、あなたのコードを変更します:
} else {
// Found a file
if ($f == $className . self::$classFileSuffix ||
$f == strtolower($className) . self::classFileSuffix) {
return $subPath;
}
}
の代わりにstrtolower()あなたが最初の文字だけを下げる、または関数を書くことができるのであれば使用してPHP> 5.3.0 lcfirst()関数を使用します(正式にリリースされません)。
あなたは正規表現を使用して、このような「Fooクラス」などのパターンのために、各ファイルの内容になります実際に.phpファイルのディレクトリをスキャンし、オートローダを使用することができます。あなたはもちろんの、好ましくはフォームクラス=>ディレクトリの配列を使用することによって、これをキャッシュする必要があります。また、あなたは、例えば、正しくキャッシュを無効に確認する必要があります新しい.phpファイルがフォルダ内にあるときます。
私は私のウェブサイトのためにこれを行うと、それは素晴らしい作品。