我們知道PHP可以實現自動加載,避免了繁重的體力活,代碼更規范,整潔。那如果我們把這個自動加載再升華一下,變成自動加載類,每次只需要引入這個類,那么其他類就自動加載了,已經開源,倉庫地址在這里。同時如果加載后可以使其常駐內存,那么效率又高了。。。
關於自動的基礎部分在前一篇博客(http://www.cnblogs.com/CpNice/p/4119925.html);
下面有幾點需要注意
1.為了實現通用性,設置一個根目錄,在大型項目中,目錄結構比較復雜,每次加載都應該有一個起始開始的目錄位置,這樣才能向后兼容。當然也可以設置多個這種目錄,放到數組里。
2.帶有命名空間的類,需要把轉義符轉換成表示目錄結構的斜線,加載的類是帶有命名空間的,因為,該類是屬於該命名空間下。(從上一篇博客就可以知道)
好了,下面貼上代碼
1 <?php 2 3 if(!defined('ROOTDIR')) 4 { 5 define('ROOTDIR',realpath(__DIR__.'/../')); //定義更目錄 6 } 7 class Autoloader { 8 9 public static function myAutoload( $name ) 10 { 11 $class_path = str_replace('\\',DIRECTORY_SEPARATOR,$name); 12 $file = ROOTDIR.'/'.$class_path.'.php'; 13 if( file_exists( $file ) ) 14 { 15 require_once( $file ); 16 if( class_exists($name, false) ) 17 { 18 return true; 19 } 20 } 21 return false; 22 } 23 } 24 spl_autoload_register('Autoloader::myAutoload');
自動加載的使用必須顯示加載,它是加載其他類的加載器,我們已經重載了PHP的自動加載沒有機制可以加載這個Autoloader,所以要 require_once('Autoloader.php');
很簡單吧,其實這個可以做的更強大。
比如,我把這個做成一個中間件,命名為Bootstrap,這個可以用於不同項目,而這些項目可以位於不同或者同一個WEB目錄下,這時需要一個靜態的屬性表示所有可能的應用目錄或者不同WEB目錄
1 public static $rootPath = array();
在加載時,就需要一個循環遍歷每一個可能的目錄,找到即加載。
同時,我們可以設置一個 setRootPath() 方法,用於設置不同項目的目錄。
public function setRootPath( $path ) { //do something return $this; }
這樣就能實現鏈式操作的添加,個人覺得比較神奇。。。
OK,關於自動加載就寫到這里,歡迎各位看官拍磚。