首先這裡要了解PSR,Proposing a Standards Recommendation(提出標准建議)的縮寫,就是一種PHP開發規范,讓我們研發出來的代碼更合理、更好維護、可讀性更高。PSR有下面幾個標准:
這裡看出PSR的下標也是從0開始的,和數組還有點像~。其實PSR-4和PSR-0是有點相似甚至冗余的,他們都說明的是自動加載的規范,只不過PSR-4中的規范更加簡潔,在PSR-0中下劃線"_"是有特殊含義的,在autoload處理的時候需要將下劃線轉換為目錄分隔符,而在PSR-4中下劃線是沒有任何特殊含義的,所以在文件自動加載的時候顯得更加簡潔、調理更加清楚。
我對github上面的psr-4規范中的例子進行了大概的翻譯(相信你們的英語水平一定比我好,肯定可以看懂^_^),然後以這個自動加載類庫做了一個小小的例子,例子文件多、長,放在這裡不太合適,所以我在博客中就大概介紹下這個例子,想要詳細了解的可以去我的github主頁去看這個例子。
首先看下自動加載類的大概內容:
class Autoload { // 注冊自動加載函數到spl autoload棧中. public function register(); // 添加一個目錄到一個命名空間前綴中 public function addNamespace($prefix, $base_dir, $prepend=false); // 自動加載函數,會在$this->register中用到 public function loadClass($class); // 尋找映射的文件 public function loadMappedFile($prefix, $relative_class); //查看一個文件是否在文件系統中存在 public function requireFile($file); }
自動加載類庫函數中就這幾個函數,其中register()、addNamespace()、loadMappedFile()、requireFile()函數都比較簡單,一看就懂,唯一一個可能需要解釋下的函數就是loadClass函數,先看下loadClass()函數的代碼:
1 public function loadClass($class) 2 { 3 // 當前的命名空間前綴 4 $prefix = $class; 5 6 //通過命名空間去查找對應的文件 7 while (false !== $pos = strrpos($prefix, '\\')) { 8 9 // 可能存在的命名空間前綴 10 $prefix = substr($class, 0, $pos + 1); 11 12 // 剩余部分是可能存在的類 13 $relative_class = substr($class, $pos + 1); 14 15 //試圖加載prefix前綴和relitive class對應的文件 16 $mapped_file = $this->loadMappedFile($prefix, $relative_class); 17 if ($mapped_file) { 18 return $mapped_file; 19 } 20 21 // 移動命名空間和relative class分割位置到下一個位置 22 $prefix = rtrim($prefix, '\\'); 23 } 24 25 // 未找到試圖加載的文件 26 return false; 27 }
其實有疑惑的地方可能也只有一個,那就是為什麼這裡要循環著去試圖查找文件,在while循環中,會慢慢的縮短命名空間前綴的名稱去需找合適的命名空間前綴,為什麼要這麼做呢?
循環查找文件是為了在命名空間中包含更多的內容,不用每次在父命名空間中新建一個文件夾的時候都去添加一個新的命名空間前綴,就像下面這個圖中描述的那樣:
三、 例子
說道這裡你可能已經對自動加載的內容比較了解了,這個時候趁熱打鐵看看我准備的小例子,這裡只是介紹下小例子的目錄結構,由於比較簡單,詳細的內容就不再這裡列了,感興趣的通許可以去我的github主頁看看這個例子
--core
-Autoload.php
--vendor
--test1
-hello.php
--test2
-world.php
-App.php
本文版權歸作者([email protected])和博客園共有,未經作者本人同意禁止任何形式的轉載,轉載文章之後必須在文章頁面明顯位置給出作者和原文連接,否則保留追究法律責任的權利。