2

自動ロードのためにphpでこのクラスを使用しています。 http://pastebin.com/m75f95c3b

しかし、私がどこかにいるとき

class Bar extends Foo

そして、クラスが見つからない foo.class.php というファイルがあります。しかし、ファイル名を Foo.class.php に変更すると、クラスが見つかります。

ファイル名が大文字で始まるかどうかに関係なく、ファイルがある場合は常にファイルを見つけるために、クラスにいくつかの機能を追加しようとしています。しかし、これまでのところ、私は成功していません。

誰?

4

5 に答える 5

6

すべてのファイルの名前が小文字の場合、クラスの各メソッドの変数値に適用strtolowerします。$className

$className = strtolower($className);

しかし、すべての開発者が従わなければならないコーディング ガイドラインを作成することをお勧めします。それ以外の場合は、大文字と小文字を使用してファイル名を記述する2 つの<ファイル名の長さ>の可能性をそれぞれテストする必要があります。

于 2009-03-20T13:31:00.917 に答える
3

Gumbo のソリューションは最良のソリューションであり、ほとんどの人が使用しています。嫌いな理由がわかりません。もちろん、最初にクラス名が大文字のファイルが存在するかどうかを確認し、存在しない場合は小文字のバージョンが存在するかどうかを確認できます。それは間違いなくガンボのソリューションよりも優れていません. 結局のところ、「あなたの」プログラマーはいくつかの規則/規則に従わなければなりません。

于 2009-03-20T14:06:21.783 に答える
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.");
    }
}

さまざまな命名規則が発生したときに、他の条件を追加するのは簡単です。

于 2009-03-20T14:04:09.730 に答える
1

以前の開発者との下位互換性を提供するために、いくつかの異なるファイル命名規則を考慮した__autoload()関数を使用しています。

各規則に対して単純なループを実行し、そのファイルが存在するかどうかを確認します。ファイルが存在する場合は、それをロードします。

私の関数では、.inc、.class、.inc.phpなどのさまざまなファイル拡張子に対してこれを行います。同じことを行うこともできますが、最初の上位文字と下位文字を検索します。

これをsearchForClassFile()メソッドに入れ、else部分に「ファイルが見つかりました」というコメントを付けます。

編集(詳細):

正しいファイルを探すためにクラスディレクトリに再帰的に降りるのではなく、クラス名を特定の場所にマップします。これは一般的な方法です。たとえば、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()関数を使用します。

于 2009-03-20T13:50:36.237 に答える
1

ディレクトリをスキャンして .php ファイルを探し、正規表現を使用して「class Foo」などのパターンの各ファイルの内容を実際に調べるオートローダーを使用できます。もちろん、できれば class => directory の形式の配列を使用して、これをキャッシュする必要があります。また、フォルダに新しい .php ファイルがある場合など、キャッシュを正しく無効化する必要もあります。

私は自分のウェブサイトでこれを行っていますが、うまく機能します。

于 2009-03-20T14:12:17.667 に答える