一個遵循PSR-4的檔案autoload的例子

來源:互聯網
上載者:User
一、簡介

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

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

  這裡看出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

  本文著作權歸作者(luluyrt@163.com)和部落格園共有,未經作者本人同意禁止任何形式的轉載,轉載文章之後必須在文章頁面明顯位置給出作者和原文串連,否則保留追究法律責任的權利。

以上就介紹了一個遵循PSR-4的檔案autoload的例子,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.