15

phpクラスオートローダーはファイルを開いてクラス名をチェックしますか?私はそれが実際にどのように実装されているかを見てきました。その再帰的であることを私が知っていることの1つ?私が間違っている場合は私に知らせてください

ここで述べたように:オートローダーの概要 PHPオートローダーのしくみ

PHP Autoloaderは、定義されたディレクトリでクラス、トレイト、およびインターフェイスの定義を再帰的に検索します。さらに構成を行わないと、必要なファイルが存在するディレクトリがデフォルトのクラスパスとして使用されます。

ファイル名は規則に従う必要はありません。すべてのファイルでクラス定義が検索されます。クラス名に類似しているファイル、または.phpまたは.incで終わるファイルが推奨されます。サポートされている場合、PHPTokenizerは信頼性の高いクラス定義の検出に使用されます。

4

1 に答える 1

23

PHP オートローダは、クラスの構築時にファイルをインクルードするメカニズムにすぎません。

すべてのクラスを 1 つのファイルに入れる場合、オートローダーは必要ありません。もちろん、オブジェクト指向をプログラミングするときは、すべてのクラスに独自のファイルを与えます。そこでオートローダーの出番です。

いくつかの例:

class AutoLoader
{  
  public function __construct()
  {
    spl_autoload_register( array( $this, 'ClassLoader' ));
  }

  public function ClassLoader( $class )
  {    
    if( class_exists( $class, false ))
      return true;

    if( is_readable( 'path_to_my_classes/' . $class . '.php' ))
          include_once 'path_to_my_classes/' . $class . '.php'
  }
}

$autoloader = new AutoLoader();

ここで何が起こるかというと、オートローダー クラスが作成されると、クラス メソッド Classloader がオートローダーとして登録されます。

新しいクラスが作成されると、Classloader メソッドはまず、クラスのファイルが既にロードされているかどうかを確認します。そうでない場合、クラスの先頭にパスが追加され、拡張子が追加されます。ファイルが読み取り可能な場合は、含まれます。

もちろん、これを非常に洗練されたものにすることもできます。名前空間とマッパーの例を見てみましょう。オートローダー クラスにいるとします。

  private $mapper array( 'Foo' => 'path_to_foo_files/', 'Bar' => 'path_to_bar_files/');

  public function ClassLoader( $class )
  {    
    if( class_exists( $class, false ))
      return true;

    // break into single namespace and class name
    $classparts = explode( '\\', $class ); 
    $path = $this->mapper[$classparts[0]];

    if( is_readable( $path . $classparts[1] . '.php' ))
          include_once $path . $classparts[1] . '.php'
  }

ここで、クラス名は名前空間部分とクラス名部分に分割されます。名前空間部分はマッパー配列で検索され、そのパスが php ファイルのインクルード パスとして使用されます。

これらは、オートローダーで何ができるかを示すための単なる例です。本番環境では、エラー チェックなど、さらにいくつかの作業を行う必要があります。

于 2012-09-16T08:00:06.890 に答える