PHP Composer 以及PSR規範

deliangyang發表於2018-06-22

背景說明

進入我的部落格

www.sourcedev.cc/

隨著專案程式碼量的不斷增加,以及一些庫的依賴,我們不得不引入包的管理,來解決不易管理、閱讀、模組化等問題。 三方庫優秀,而且很多人在維護,功能對接也方便,我們沒有必要在這個一個常用的功能上花費時間來封裝或者造輪子, 很多人在自己的專案中都實踐過,出現了問題,反應的issue也很快會被解決掉,功能也不斷在完善。 一直強調,站在巨人的肩膀上,我們會走的更遠,也許我們自己擼出來的程式碼難等大雅之堂,無法比擬, 把重心放在自己的核心產品和功能時間上,學會借鑑學習和使用,降低自己的開發成本。 也許有人會覺得我使用三方庫可能會造成效能上的影響,有些功能我根本用不到。專案中程式碼有很多無用的程式碼,導致檔案載入過慢, 其實不用擔心, opcache可以將php指令碼預編譯到共享記憶體中來提升php的效能。

php Composer psr-4 autoload

Composer 是php用來管理依賴關係的工具,可以在專案中宣告外部依賴的工具庫,Composer會幫你安裝這些依賴的庫檔案 psr-4 是一種程式碼規範,能夠實現package的自動載入,規範瞭如何從檔案路徑自動載入類,同時也規範了自動載入檔案的位置

自動載入

我們在支援Composer的專案中,只需引入這個檔案,加上下面這段php的程式碼,就可以得到自動載入的支援了

<?php

require_once __DIR __ . '/vendor/autoload.php';

複製程式碼

composer.json

{
    "autoload": {
        "psr-4": {
            "Work\\": "src/"
        },
        "psr-0": {
            "Vendor_Namespace_": "src/"
        }
    }
}
複製程式碼

Composer 將註冊一個 PSR-4 autoloader 到 Work 名稱空間, PSR-0 則支援_,自動轉化為目錄結構

classmap

不遵循PSR-0/4規範的類庫,

files

明確的指定檔案載入

額外的

repositories 自定義資源包庫

type

  • composer Composer 型別的資源庫,是一個簡單的網路伺服器上的
  • vcs git、svn、hg等
  • pear 從pear上獲取資源
  • package 內聯一個composer.json物件

scripts

Composer 允許你在安裝過程中的各個階段掛接指令碼。

詳細流程

典型的命令,composer安裝時

  • post-install-cmd composer install執行之後觸發
  • post-update-cmd composer update執行之後觸發

自定義指令碼demo

{
    "scripts": {
        "post-update-cmd": "MyVendor\\MyClass::postUpdate",
        "post-package-install": [
            "MyVendor\\MyClass::postPackageInstall"
        ],
        "post-install-cmd": [
            "MyVendor\\MyClass::warmCache",
            "phpunit -c app/",
            "find vendor -type d -name .git -exec rm -rf '{}' \\;"
        ]
    }
}
複製程式碼
<?php

namespace MyVendor;

use Composer\Script\Event;

class MyClass
{
    public static function postUpdate(Event $event)
    {
        $composer = $event->getComposer();
        // do stuff
    }

    public static function postPackageInstall(Event $event)
    {
        $installedPackage = $event->getOperation()->getPackage();
        // do stuff
    }

    public static function warmCache(Event $event)
    {
        // make cache toasty
    }
}
複製程式碼

不然看出執行的指令碼可以是一個類中的靜態方法,當然也可以是一個函式,還可以是一條shell命令

我們也可以手動執行一些命令

composer run-script [--dev] [--no-dev] script
複製程式碼

擴充套件

順便了解一下其他的幾個程式碼規範

PSR

psr-0 自動載入

psr-1 基本程式碼規範

  • 檔案內只出現 <?php<?= 標籤 (必須)
  • 只是用utf-8 沒有BOM頭的php程式碼 (必須)
  • 宣告新的型別符,不產生副作用
  • 名稱空間遵循autoload自動載入psr-0/4規範(必須)
  • 類名駝峰(必須)
  • 類中的常量下劃線_分隔(必須)
  • 方法駝峰(必須)

psr-2 程式碼樣式

  • 必須遵循psr-1
  • 四個空格,而非tab
  • 限制每行長度 80或者更少
  • namespace 和 use 必須空格
  • 類的括號必須獨立一行
  • 類的方法也一樣
  • 所有的屬性和方法必須在修飾符之前,static在之後
  • 關鍵詞之後必須有空格
  • 程式碼流程控制,{ 在一行,}獨立一行
  • {之後沒有空格,}之前沒有空格

psr-3 日誌介面

  • 錯誤級別RFC 5424 (debug, info, notice, warning, error, critical, alert, emergency)

psr-4 自動載入

相比於 psr-0 規範比較乾淨 PSR-0規範中下劃線_會被轉化成為目錄分割線 上面有詳細的介紹,這裡就不再重複

psr-6 快取介面

psr-7 http訊息介面

psr-11 容器介面

psr-13 超媒體連結

psr-15 http控制程式碼

psr-16 簡單快取

收集或者檢視過的

相關文章