PHP の autoload を使ってみる

PHP5 からは、オブジェクト指向言語らしくクラスのオートローディングが可能になりました。
具体的には、明示的に require_once “foo.php” としなくても、

function __autoload($class){
    include_once $class . “.php”;
}

としておけば、

$foo = new foo;

とした時に include_path から自動的に foo.php をインクルードしてくれる,というものです。
 
ただ、class_exists()はデフォルトで__autoload()を呼び出すらしいので __autoload() の実装は以下のような感じにするのがよさそうです。

function __autoload($class){
   // 検索する拡張子一覧
   $exts = array(“php”, “inc”, “class.inc”, “class.php”);
   // 検索するディレクトリ一覧( “./” や “../” で始めると,その指定については include_path を見なくなるので注意 | PHP マニュアル include() 参照)
   $dirs = array(“”, “include/”, “classes/”);
   // include_path を検索し、存在すればそのファイルをインクルードする。
   // 存在しなければ何もしない。
   foreach($dirs as $dir){
     foreach($exts as $ext){
       $file = $dir . $class . “.” . $ext;
       // echo “Debug: trying $file \n”;
       if($fp = @fopen($file, “r”, 1)){
         @fclose($fp);
         require_once $file;
         return;
       }
       // PEAR Style
       $file = $dir . str_replace(“_”, “/”, $class) . “.” . $ext;
       // echo “Debug: trying $file \n”;
       if($fp = @fopen($file, “r”, 1)){
         @fclose($fp);
         require_once $file;
         return;
       }
     }
   }
}