深刻學習Composer原理(三)

本系列第三篇文章,一塊兒瞭解下PSR規範中的PSR4和PSR0規範

首先恭喜你們,包括我本身,堅持到了如今。這篇文章以後,Composer的基礎原理就清晰明瞭咯。也就是說,Composer所利用的正是spl_autoload_register()和PSR4規範,而後經過線上服務器存儲包,來實現包管理的功能。spl_autoload_register()的做用咱們已經清楚了,主要就是動態加載咱們所須要的文件。然而咱們的文件不可能都亂七八糟的隨便找個目錄放下,而後註冊一堆的spl_autoload_register()來加載吧,要真這麼寫,估計你的老闆會廢了你。在這個時候,PSR路徑規範的做用就顯示出來咯!!php

本文參考PSR規範:https://psr.phphub.org/git

PSR4的格式

\<命名空間>(\<子命名空間>)*\類名github

具體的內容直接上文中提供的參考連接,這裏總結重要的幾點:服務器

  • 頂級命名空間必須有一個
  • 子命名空間能夠多個或沒有
  • 類名必須有
  • 大小寫敏感,下劃線無實際意義(注意,下劃線是主要的和PSR0的區別)

類名與文件載入的對應

  • 去掉最前面的命名空間的分隔符,前面的命名空間做爲[命名空間前綴],必須與至少一個[文件基目錄]對應
  • 子命名空間與[文件基目錄]下的文件夾對應,命名空間分隔符號做爲目錄分隔符號
  • 末尾的類名,與最終目錄下的對應的.php文件相同
  • autoload的實現不可出現異常,也就是要解決掉異常問題

估計各位看得一臉懵逼吧!!微信

其實很好理解,舉例說明,咱們先創建一個目錄叫myvendor,裏面放着經常使用的工具包,如圖:composer

image

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

相關文章
相關標籤/搜索