laravel源碼探析(一):composer自動加載

      laravle是目前很火的一款php框架,國內外的用戶非常多。laravel的特點是優雅簡潔,作者泰勒給laravel的定義是:A PHP Framework For Web Artisans。利用laravel快速開發網絡應用,爲我們節省了大量時間,可以從雜亂無章的代碼中解脫出來而專注於應用本身。然而laravel的另一個特點是使用了大量的php新特性,還有衆多晦澀難懂的設計模式,這對新手來說並不容易理解。這篇文章的目的旨在站在新手的角度來理解laravel的框架源碼。

      安裝laravel框架後,找到它的入口文件,即“項目目錄”---“public”----“index.php”。 
      index.php裏面只有幾行代碼,首先是require一個類加載器,看上面的註釋可以知道

 這是由composer生成的類加載器。Composer 是 PHP 的一個依賴管理工具。它允許你申明項目所依賴的代碼庫,然後在你的項目中爲你安裝這些類庫。關於composer的更多細節見官網:https://www.phpcomposer.com/。加載完autoload加載器之後,再用require_once加載了一個$app實例,這個實例就像一個黑盒子一樣,傳入請求,輸出響應。我們會在後面的筆記探究$app實例的內部細節。本篇先來看看自動加載器的實現。

順着加載路徑定位到ventor文件夾下的autoload.php:

在這個文件裏引入autoload_real.php文件,並且調用了類ComposerAutoloaderInit883401218dc8e863111174f5eb47a0bc的靜態方法getLoader();我們的自動加載器就是由這個靜態方法生成的,這個名字很長的類,是composer自動爲我們生成的。打開autoload_real.php文件看看ComposerAutoloaderInit883401218dc8e863111174f5eb47a0bc類的內部實現。

這個類定義了一個私有變量$loader,和兩個靜態方法,一個公有方法。直接看getLoader()方法,getLoader方法獲取類加載器,並把類加載器保存到靜態變量$loader中。

 

首先判斷靜態變量$loader是否爲空,若不空,直接返回$loader。若不存在則實例化類Composer\Autoload\ClassLoader。實例化加載器後,再調用Composer\Autoload\ClassLoader類的方法綁定一些靜態的路徑信息、命名空間信息以及命名空間到目錄的映射。命名空間的定義符合psr-0或psr-4標準(更多關於psr的信息見官網:https://www.php-fig.org/psr/)。完成綁定後,最後也是最重要的一步,調用Composer\Autoload\ClassLoader類的register方法註冊。

這裏調用了,系統函數spl_autoload_register將加載器$loader註冊到自動加載隊列。這樣當每次實例化一個當前未定義的類時,就會調用加載器的loadClass方法爲我們把需要的類文件include進來,從而實現自動加載。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章