深入學(xué)習(xí)Composer原理(三)

本系列第三篇文章,一起了解下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,里面放著常用的工具包,如圖:

image

那么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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容