PSR-PHP開發規範(本文版權歸做者:luluyrt@163.com)

遵循PSR-4的自動加載

1、簡介

  首先這裏要了解PSR,Proposing a Standards Recommendation(提出標準建議)的縮寫,就是一種PHP開發規範,讓咱們研發出來的代碼更合理、更好維護、可讀性更高。PSR有下面幾個標準:php

  •   PSR-0:自動加載
  •   PSR-1:基本代碼規範
  •     PSR-2:代碼樣式
  •   PSR-3:日誌接口
  •   PSR-4:規範自動加載的路徑問題

  這裏看出PSR的下標也是從0開始的,和數組還有點像~。其實PSR-4和PSR-0是有點類似甚至冗餘的,他們都說明的是自動加載的規範,只 不過PSR-4中的規範更加簡潔,在PSR-0中下劃線"_"是有特殊含義的,在autoload處理的時候須要將下劃線轉換爲目錄分隔符,而在PSR- 4中下劃線是沒有任何特殊含義的,因此在文件自動加載的時候顯得更加簡潔、調理更加清楚。html

  我對github上面的psr-4規範中的例子進行了大概的翻譯(相信大家的英語水平必定比我好,確定能夠看懂^_^),而後以這個自動加載類 庫作了一個小小的例子,例子文件多、長,放在這裏不太合適,因此我在博客中就大概介紹下這個例子,想要詳細瞭解的能夠去個人github主頁去看這個例 子。git

2、 自動加載類庫介紹

  首先看下自動加載類的大概內容: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循環中,會慢慢的縮短命名空間前綴的名稱去需找合適的命名空間前綴,爲何要這麼作呢?app

  循環查找文件是爲了在命名空間中包含更多的內容,不用每次在父命名空間中新建一個文件夾的時候都去添加一個新的命名空間前綴,就像下面這個圖中描述的那樣:函數

  當一個文件在一個命名空間下的子目錄下的時候,咱們不用去新建命名空間前綴就能夠成功加載須要的文件,維護命名空間前綴的數組內容更少,更好維護。相反的若是沒有循環查找,就是下面這個樣子的post

  

  每次新建一個子目錄就要去新加一個命名空間前綴,是否是很麻煩,但這樣的話也有必定的好處,就是加載的時候不暈循環查找文件,可能會減少必定的時間消耗,但就是加載的時候有點麻煩。ui

  因此,用循環加載這種方式仍是比較方便的,可是必定不能讓沒有命名空間前綴的目錄層級太深,這樣會消耗沒必要要的時間到文件加載上。當須要效率很 高的時候,而咱們的目錄確定又不會不肯定,這個時候加載的時候去掉循環查找,而是爲每一個目錄添加命名空間,效率可能會提升,只是個人一點愚見。this

3、 例子

  說道這裏你可能已經對自動加載的內容比較瞭解了,這個時候趁熱打鐵看看我準備的小例子,這裏只是介紹下小例子的目錄結構,因爲比較簡單,詳細的內容就再也不這裏列了,感興趣的通許能夠去個人github主頁看看這個例子

+autoload
+core
|_Autoload.php
+vendor
+test1
|_hello.php
+test2
|_world.php
|_App.php

  本文版權歸做者(luluyrt@163.com)和博客園共有,未經做者本人贊成禁止任何形式的轉載,轉載文章以後必須在文章頁面明顯位置給出做者和原文鏈接,不然保留追究法律責任的權利。

相關文章
相關標籤/搜索