composer 路径_深入学习Composer原理(三)
本系列第三篇文章,一起了解下PSR規范中的PSR4和PSR0規范
首先恭喜大家,包括我自己,堅持到了現在。這篇文章之后,Composer的基礎原理就清晰明了咯。也就是說,Composer所利用的正是spl_autoload_register()和PSR4規范,然后通過線上服務器存儲包,來實現包管理的功能。spl_autoload_register()的作用我們已經清楚了,主要就是動態加載我們所需要的文件。然而我們的文件不可能都亂七八糟的隨便找個目錄放下,然后注冊一堆的spl_autoload_register()來加載吧,要真這么寫,估計你的老板會廢了你。在這個時候,PSR路徑規范的作用就顯示出來咯!!
本文參考PSR規范:https://psr.phphub.org/
PSR4的格式
<命名空間>(<子命名空間>)*類名具體的內容直接上文中提供的參考鏈接,這里總結重要的幾點:
- 頂級命名空間必須有一個
- 子命名空間可以多個或沒有
- 類名必須有
- 大小寫敏感,下劃線無實際意義(注意,下劃線是主要的和PSR0的區別)
類名與文件載入的對應
- 去掉最前面的命名空間的分隔符,前面的命名空間作為[命名空間前綴],必須與至少一個[文件基目錄]對應
- 子命名空間與[文件基目錄]下的文件夾對應,命名空間分隔符號作為目錄分隔符號
- 末尾的類名,與最終目錄下的對應的.php文件相同
- autoload的實現不可出現異常,也就是要解決掉異常問題
估計各位看得一臉懵逼吧!!
其實很好理解,舉例說明,我們先建立一個目錄叫myvendor,里面放著常用的工具包,如圖:
那么TestClass.php的命名空間應該是Test,而CaseClass的應該是CaseModelCaseChild。統一從myvendor這個文件夾作為入口進入。也就是myvendor是一個超級[基目錄],然后Test和CaseModel是對應命名空間的兩個[文件基目錄],剩下的子個名空間與目錄對應。官網中還有其他的展示方式,但在這里我們用這種最標準的方式。
其實說白了,就是命名空間和目錄對應上,寫代碼找文件就方便得很啦!!
上面說的是PSR4的規范,那么PSR0又是什么鬼?目前來說PSR0已經廢棄了,它們兩個大部分內容還是相近的,最大的區別在于PSR0中的_這個符號是有意義的,也就是/namespace/package/Class_Name這樣的內容,會去提供/namespace/package/Class/Name.php文件,而PSR4中則忽略_這個符號的意義,還是去查找Class_Name.php這個文件。
TestClass.php代碼<?phpnamespace Test;class TestClass {public function show(){echo "we are family!n";} }CaseClass.php代碼<?phpnamespace CaseModelCaseChild;class CaseClass {public function show(){echo "Good!n";} }接下來,在myvendor目錄外面添加一個psr4.php文件,代碼如下:
<?phpspl_autoload_register(function ($class) {$vendor = __DIR__ . '/myvendor';$file = $vendor . '/' . str_replace('', '/', $class) . '.php';if (file_exists($file)) {require $file;} });use CaseModelCaseChildCaseClass; use TestTestClass;$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
總結
以上是生活随笔為你收集整理的composer 路径_深入学习Composer原理(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分屏 取消_记录Android7.0以上
- 下一篇: C语言里 指针变量强制类型转换,C语言之