首先恭喜你們,包括我本身,堅持到了如今。這篇文章以後,Composer的基礎原理就清晰明瞭咯。也就是說,Composer所利用的正是spl_autoload_register()和PSR4規範,而後經過線上服務器存儲包,來實現包管理的功能。spl_autoload_register()的做用咱們已經清楚了,主要就是動態加載咱們所須要的文件。然而咱們的文件不可能都亂七八糟的隨便找個目錄放下,而後註冊一堆的spl_autoload_register()來加載吧,要真這麼寫,估計你的老闆會廢了你。在這個時候,PSR路徑規範的做用就顯示出來咯!!php
本文參考PSR規範:https://psr.phphub.org/git
\<命名空間>(\<子命名空間>)*\類名github
具體的內容直接上文中提供的參考連接,這裏總結重要的幾點:服務器
估計各位看得一臉懵逼吧!!微信
其實很好理解,舉例說明,咱們先創建一個目錄叫myvendor,裏面放着經常使用的工具包,如圖:composer
那麼TestClass.php的命名空間應該是Test,而CaseClass的應該是CaseModel\CaseChild。統一從myvendor這個文件夾做爲入口進入。也就是myvendor是一個超級[基目錄],而後Test和CaseModel是對應命名空間的兩個[文件基目錄],剩下的子個名空間與目錄對應。官網中還有其餘的展現方式,但在這裏咱們用這種最標準的方式。工具
其實說白了,就是命名空間和目錄對應上,寫代碼找文件就方便得很啦!!學習
上面說的是PSR4的規範,那麼PSR0又是什麼鬼?目前來講PSR0已經廢棄了,它們兩個大部份內容仍是相近的,最大的區別在於PSR0中的_這個符號是有意義的,也就是/namespace/package/Class_Name這樣的內容,會去提供/namespace/package/Class/Name.php文件,而PSR4中則忽略_這個符號的意義,仍是去查找Class_Name.php這個文件。ui
TestClass.php代碼spa
<?php namespace Test; class TestClass { public function show() { echo "we are family!\n"; } }
CaseClass.php代碼
<?php namespace CaseModel\CaseChild; class CaseClass { public function show() { echo "Good!\n"; } }
接下來,在myvendor目錄外面添加一個psr4.php文件,代碼以下:
<?php spl_autoload_register(function ($class) { $vendor = __DIR__ . '/myvendor'; $file = $vendor . '/' . str_replace('\\', '/', $class) . '.php'; if (file_exists($file)) { require $file; } }); use CaseModel\CaseChild\CaseClass; use Test\TestClass; $t = new TestClass(); $t->show(); $c = new CaseClass(); $c->show();
神奇的事情發生了,文件自動加載進來了,有點高大上吧,至此,關於Composer的自動加載部分就結束了。咱們一塊兒學習到了PHP是如何經過spl_autoload_register方法來自動加載文件,而且經過PSR4規範來造成約束,讓你們都有一套統一的規範。而這些,正是Composer的靈魂和肉身。
完整源碼:https://github.com/zhangyue0503/php-blog-code-resource/tree/master/composer/base/psr4namespace
===============
關注公衆號:【硬核項目經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、項目管理學習資料
知乎、公衆號、抖音、頭條搜索【硬核項目經理】
B站ID:482780532