本系列第三篇文章,一起了解下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的應該是CaseModel\CaseChild,統一從myvendor這個檔案夾作為入口進入,也就是myvendor是一個超級[基目錄],然后Test和CaseModel是對應命名空間的兩個[檔案基目錄],剩下的子個名空間與目錄對應,官網中還有其他的展示方式,但在這里我們用這種最標準的方式,
其實說白了,就是命名空間和目錄對應上,寫代碼找檔案就方便得很啦!!
上面說的是PSR4的規范,那么PSR0又是什么鬼?目前來說PSR0已經廢棄了,它們兩個大部分內容還是相近的,最大的區別在于PSR0中的_這個符號是有意義的,也就是/namespace/package/Class_Name這樣的內容,會去提供/namespace/package/Class/Name.php檔案,而PSR4中則忽略_這個符號的意義,還是去查找Class_Name.php這個檔案,
TestClass.php代碼
<?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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/231747.html
標籤:PHP
