日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

你不知道的composer自动加载

發布時間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你不知道的composer自动加载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

我們都知道Composer是現代PHP框架(Yii2、Laravel...)的基石,有了Composer后我們開發是一件多么的爽的事情。

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

我們以Yii2為例,當我們通過Composer生成了一個Yii2程序后,會在vendor下建立一個autoload.php文件,它負責幫我們自動加載vendor內的各種庫(yii2核心庫也在vendor內,你懂得!)。

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

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

由此可見,Yii2對Composer的友好程度,也難怪~孤木不成林,Yii2也要靠無數個Composer擴展枝干才能變成參天大樹。

下面開始正式講解Composer的autoload,告訴你各式各樣擴展安裝后,我們并沒有使用include / require,那么Composer是如何幫我們找到他們的那?

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

  • PSR-0
  • PSR-4
  • class-map
  • 直接包含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"類的使用,會去尋找"src\Bar\Baz.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-index.html

    轉載于:https://my.oschina.net/abei2017/blog/865038

    總結

    以上是生活随笔為你收集整理的你不知道的composer自动加载的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。