2016-07-29 3 views
-3

私はこのコードが単一ディレクトリ内のすべてのクラスを自動的にロードすることを発見しました。私は別のパス(ディレクトリ)からクラスをロードするためにそれを少し拡張することができるようにしたいと思います。ここでは、コードは次のようになりますように私のindex.phpファイル内ラントで、その後異なるディレクトリのPHPオートロードクラス

define('PATH', realpath(dirname(__file__)) . '/classes') . '/'; 
    define('DS', DIRECTORY_SEPARATOR); 

    class Autoloader 
    { 
     private static $__loader; 


     private function __construct() 
     { 
      spl_autoload_register(array($this, 'autoLoad')); 
     } 


     public static function init() 
     { 
      if (self::$__loader == null) { 
       self::$__loader = new self(); 
      } 

      return self::$__loader; 
     } 


     public function autoLoad($class) 
     { 
      $exts = array('.class.php'); 

      spl_autoload_extensions("'" . implode(',', $exts) . "'"); 
      set_include_path(get_include_path() . PATH_SEPARATOR . PATH); 

      foreach ($exts as $ext) { 
       if (is_readable($path = BASE . strtolower($class . $ext))) { 
        require_once $path; 
        return true; 
       } 
      } 
      self::recursiveAutoLoad($class, PATH); 
     } 

     private static function recursiveAutoLoad($class, $path) 
     { 
      if (is_dir($path)) { 
       if (($handle = opendir($path)) !== false) { 
        while (($resource = readdir($handle)) !== false) { 
         if (($resource == '..') or ($resource == '.')) { 
          continue; 
         } 

         if (is_dir($dir = $path . DS . $resource)) { 
          continue; 
         } else 
          if (is_readable($file = $path . DS . $resource)) { 
           require_once $file; 
          } 
        } 
        closedir($handle); 
       } 
      } 
     } 
    } 

Autoloader::init(); 

私はあなたがインクルードパスに他のディレクトリを追加することができ、PHP 5.6

+0

質問がありましたか?このサイトは、あなたの予定リストをダンプし、他の人があなたのためにあなたの仕事をすることを期待する場所ではなく、質問のためのサイトです。 –

+0

@Marc B、はい私の質問は、クラスを拡張して複数のディレクトリをスキャンする方法です。私は誰も私の仕事をすることを期待していません。私はコードを提供しました。私はそれに助けが必要です。あなたが助けたいと思わないなら、このスペースを無駄にしてはいけません。 – Alko

+0

コードを修正します。あなたのために書いたり、システムの設計を手助けしたりすることはありません。それはあなたの仕事です。あなたは何かをやってみる、私たちは(多分)それを修正しようとしてみてください。 –

答えて

0

を使用していますクラスファイルが既存のクラスファイルと同じ拡張子を持つ場合、オートローダはそれらを見つけるでしょう

前へAutoloader:init()、do:

//directories you want the autoloader to search through 
$newDirectories = ['/path/to/a', '/path/to/b']; 
$path = get_include_path().PATH_SEPARATOR; 
$path .= implode(PATH_SEPARATOR, $newDirectories); 
set_include_path($path) 
関連する問題