你不知道的Composer加載方式

咱們都知道Composer是現代PHP框架(Yii二、Laravel...)的基石,有了Composer後咱們開發是一件多麼的爽的事情。javascript

本文僅僅關注Composer的自動加載。php

咱們以Yii2爲例,當咱們經過Composer生成了一個Yii2程序後,會在vendor下創建一個autoload.php文件,它負責幫咱們自動加載vendor內的各類庫(yii2核心庫也在vendor內,你懂得!)。html

而你必定知道Yii2的入口文件index.php有一行。java

require(__DIR__ . '/../vendor/autoload.php');

因而可知,Yii2對Composer的友好程度,也難怪~孤木不成林,Yii2也要靠無數個Composer擴展枝幹才能變成參天大樹。json

下面開始正式講解Composer的autoload,告訴你各式各樣擴展安裝後,咱們並無使用include / require,那麼Composer是如何幫咱們找到他們的那?yii2

目前爲止,Composer一共支持4種自動加載方式app

  1. PSR-0composer

  2. PSR-4框架

  3. class-mapyii

  4. 直接包含file

這四種方式足以讓Composer涵蓋地球上全部的PHP第三方擴展庫。

PSR是一套PHP開發標準,如今大多數主流框架都在支持,工兵連已經開專題分享PSR乾貨。

PSR-4

PSR-4是Composer推薦使用的一種方式,由於它更易使用並能帶來更簡潔的目錄結構。在一個擴展的composer.json裏是這樣進行配置的:

{
    "autoload": {
        "psr-4": {
            "Foo\\": "src/",
        }
    }
}

key和value就定義出了namespace以及其對應的目錄映射。按照PSR-4的規則,當試圖自動加載"Foo\Bar\Baz"類的使用,會去尋找"srcBarBaz.php"這個文件,若是它存在則加載,要注意的是此時"Foo\"並不會出如今文件路徑中。

而composer.json這樣的配置會被Composer轉換成namespace與文件目錄的MAP形式,並存在vendor/composer/autoload_psr4.php文件中,因此若是你安裝的某個擴展自動加載是PSR-4形式,你能夠在autoload_psr4.php找到它的真實路徑。

PSR-0

這是一個已通過時的標準,那是在遙遠的PHP5.2時代,你我都知道,PHP5.3以後纔有了相似namespace這樣的高級屬性,因此PSR-0更可能是考慮<=5.2時代的擴展,因而乎PSR組織用了一個僞namespace的作法。

有點蒙圈麼?那咱們來看代碼你就明白了。

{
    "autoload": {
        "psr-0": {
            "Foo\\": "src/",
        }
    }
}

咱們來分析這個擴展的加載方式,什麼是僞namespace那?當咱們用這個庫的時候

$model = new Foo_Bar_Baz();

對的,PSR-0的時代,有不少如下劃線分隔的類名,它表明。。。它表明。。。

src/Foo/Bar/Baz.php

聰明的你必定明白什麼是僞namespace了吧,經過命名的下劃線來映射目錄結構。
哎,那個時代的標準制定者們也真心不容易呀。

Class-map方式

{
    "autoload": {
        "classmap": ["src/", "lib/"]
    }
  }

這個加載方式比較容易理解,當Composer開始安裝擴展的時候,會根據composer.json裏的這個 autoload 告訴的方式classmap,來遍歷src、lib目錄而後將裏面的類文件和其路徑一一對應,存放到vendor/composer/autoload_classmap.php內。

例如src/下有一個BaseController類,那麼在autoload_classmap.php文件中,就會生成這樣的配置:

'BaseController' => $baseDir . '/src/BaseController.php'

若你還不懂,去看看autoload_classmap.php吧。

File方式

有了上面這些加載方式還不夠麼? 是的,還會有一些供全局使用的好比幫助等這樣函數,那麼好吧,咱們就講這些文件直接包含進來好了。

{
    "autoload": {
        "files": ["src/MyLibrary/functions.php"]
    }
}

Composer安裝擴展後會將其放到

vendor/composer/autoload_files.php

到此刻,世界清靜了,Composer能夠加載我大PHP世界的各類庫,只要你想,就能夠自動加載。

原文連接 http://nai8.me/sapper-view.ht...

相關文章
相關標籤/搜索