PHP 實現自動加載器(Autoloader)


   我們知道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,關於自動加載就寫到這里,歡迎各位看官拍磚。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM