本系列第三篇文章,一起了解下PSR規(guī)范中的PSR4和PSR0規(guī)范
首先恭喜大家,包括我自己,堅(jiān)持到了現(xiàn)在。這篇文章之后,Composer的基礎(chǔ)原理就清晰明了咯。也就是說(shuō),Composer所利用的正是spl_autoload_register()和PSR4規(guī)范,然后通過(guò)線上服務(wù)器存儲(chǔ)包,來(lái)實(shí)現(xiàn)包管理的功能。spl_autoload_register()的作用我們已經(jīng)清楚了,主要就是動(dòng)態(tài)加載我們所需要的文件。然而我們的文件不可能都亂七八糟的隨便找個(gè)目錄放下,然后注冊(cè)一堆的spl_autoload_register()來(lái)加載吧,要真這么寫,估計(jì)你的老板會(huì)廢了你。在這個(gè)時(shí)候,PSR路徑規(guī)范的作用就顯示出來(lái)咯?。?/p>
本文參考PSR規(guī)范:https://psr.phphub.org/
PSR4的格式
\<命名空間>(\<子命名空間>)*\類名
具體的內(nèi)容直接上文中提供的參考鏈接,這里總結(jié)重要的幾點(diǎn):
- 頂級(jí)命名空間必須有一個(gè)
- 子命名空間可以多個(gè)或沒(méi)有
- 類名必須有
- 大小寫敏感,下劃線無(wú)實(shí)際意義(注意,下劃線是主要的和PSR0的區(qū)別)
類名與文件載入的對(duì)應(yīng)
- 去掉最前面的命名空間的分隔符,前面的命名空間作為[命名空間前綴],必須與至少一個(gè)[文件基目錄](méi)對(duì)應(yīng)
- 子命名空間與[文件基目錄](méi)下的文件夾對(duì)應(yīng),命名空間分隔符號(hào)作為目錄分隔符號(hào)
- 末尾的類名,與最終目錄下的對(duì)應(yīng)的.php文件相同
- autoload的實(shí)現(xiàn)不可出現(xiàn)異常,也就是要解決掉異常問(wèn)題
估計(jì)各位看得一臉懵逼吧!!
其實(shí)很好理解,舉例說(shuō)明,我們先建立一個(gè)目錄叫myvendor,里面放著常用的工具包,如圖:

那么TestClass.php的命名空間應(yīng)該是Test,而CaseClass的應(yīng)該是CaseModel\CaseChild。統(tǒng)一從myvendor這個(gè)文件夾作為入口進(jìn)入。也就是myvendor是一個(gè)超級(jí)[基目錄](méi),然后Test和CaseModel是對(duì)應(yīng)命名空間的兩個(gè)[文件基目錄](méi),剩下的子個(gè)名空間與目錄對(duì)應(yīng)。官網(wǎng)中還有其他的展示方式,但在這里我們用這種最標(biāo)準(zhǔn)的方式。
其實(shí)說(shuō)白了,就是命名空間和目錄對(duì)應(yīng)上,寫代碼找文件就方便得很啦!!
上面說(shuō)的是PSR4的規(guī)范,那么PSR0又是什么鬼?目前來(lái)說(shuō)PSR0已經(jīng)廢棄了,它們兩個(gè)大部分內(nèi)容還是相近的,最大的區(qū)別在于PSR0中的_這個(gè)符號(hào)是有意義的,也就是/namespace/package/Class_Name這樣的內(nèi)容,會(huì)去提供/namespace/package/Class/Name.php文件,而PSR4中則忽略_這個(gè)符號(hào)的意義,還是去查找Class_Name.php這個(gè)文件。
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";
}
}
接下來(lái),在myvendor目錄外面添加一個(gè)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();
神奇的事情發(fā)生了,文件自動(dòng)加載進(jìn)來(lái)了,有點(diǎn)高大上吧,至此,關(guān)于Composer的自動(dòng)加載部分就結(jié)束了。我們一起學(xué)習(xí)到了PHP是如何通過(guò)spl_autoload_register方法來(lái)自動(dòng)加載文件,并且通過(guò)PSR4規(guī)范來(lái)形成約束,讓大家都有一套統(tǒng)一的規(guī)范。而這些,正是Composer的靈魂和肉身。
完整源碼:https://github.com/zhangyue0503/php-blog-code-resource/tree/master/composer/base/psr4namespace
===============
關(guān)注公眾號(hào):【硬核項(xiàng)目經(jīng)理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費(fèi)得PHP、項(xiàng)目管理學(xué)習(xí)資料
知乎、公眾號(hào)、抖音、頭條搜索【硬核項(xiàng)目經(jīng)理】
B站ID:482780532