PHP DIY 系列------基礎篇:1. PSR

13sai發表於2020-02-18

PHP DIY系列–一起手寫一個api框架

創作初衷

  • 有沒有用煩了CURD?
  • 各種框架是不是有點頭大?
  • 有沒有嘗試自己設計一個框架?
  • 學了PHP語法,沒有專案去實戰,夯實基礎

希望能幫助能讓你快速地搭建一個自己的框架,能給你的工作或者學習中帶來一定的幫助與啟發。

你能學到什麼

  1. PSR規範
  2. composer的使用
  3. 快速搭建一個API介面框架
  4. Redis各種資料型別的應用
  5. 快取應用分析

在開發框架之前,我來介紹框架開發遵循的規範。

大多數程式語言都有自己的一套編碼規範,作為“世界上最好的語言”,PHP當然也有自己的編碼規範。這個規範就是PHP Standard Recommendation(簡稱PSR)。

當然,從我自己的工作中,我發現很多PHP程式設計師尤其是初級程式設計師,是不知道PHP是有這麼一個規範的,我認為這是不科學的。

什麼是PSR?

介紹PSR之前需要介紹一下制定此規範的組織—–PHP-FIG,全稱是PHP Framework Interoperability。

組織成員制定規範,並且落實在自己的專案中,雖然不是官方組織,但也代表了大部分PHP社群專案,如CakePHP,Composer,Drupal,PEAR,Slim,Yii framework,Zend Framework等。並且有越來越多的專案加入並遵循此標準。

PSR專案的目的在於:通過框架作者或者框架的代表之間討論,以最低程度的限制,制定一個協作標準,各個框架遵循統一的編碼規範,讓工程師一起更好協同工作。

截止目前,已經官網已有20條列出,除去起草中和捨棄的,有以下13條。

PSRs


我們不妨來看看這些規範:

PSR-1 基礎編碼規範

  • PHP 程式碼檔案必須以 <?php 或 <?= 標籤開始
  • PHP 程式碼檔案必須以不帶BOM的UTF-8編碼
  • PHP 程式碼中 應該 只定義類、函式、常量等宣告,或其他會產生 副作用 的操作(如:生成檔案輸出以及修改 .ini 配置檔案等),二者只能選其一
  • 名稱空間以及類必須符合 PSR 的自動載入規範PSR-4
  • 類的命名必須遵循 StudlyCaps 式大寫開頭的駝峰命名規範
  • 類中的常量所有字母都必須 大寫,單詞間用下劃線分隔
  • 方法名稱必須符合 camelCase 式的小寫開頭駝峰命名規範

PSR-12 程式碼風格規範

PSR-12的規範很細緻,包含了宣告、名稱空間、類及繼承以及控制結構等說明。

我們先來看一個demo:

<?php

declare(strict_types=1);

namespace Vendor\Package;

use Vendor\Package\{ClassA as A, ClassB, ClassC as C};
use Vendor\Package\SomeNamespace\ClassD as D;

use function Vendor\Package\{functionA, functionB, functionC};

use const Vendor\Package\{ConstantA, ConstantB, ConstantC};

class Foo extends Bar implements FooInterface
{
    public function sampleFunction(int $a, int $b = null): array
    {
        if ($a === $b) {
            bar();
        } elseif ($a > $b) {
            $foo->bar($arg1);
        } else {
            BazClass::bar($arg2, $arg3);
        }
    }

    final public static function bar()
    {
        // method body
    }
}
  • 程式碼 必須 遵循 [PSR-1] 中的編碼規範
  • 所有PHP檔案必須使用Unix LF (linefeed)作為行的結束符;
  • 所有PHP檔案必須以一個空白行作為結束;
  • 純PHP程式碼檔案必須省略最後的 ?> 結束標籤
  • 每行的字元數 應該軟性保持在 80 個之內,理論上 一定不可 多於 120 個,但一定不可有硬性限制;非空行後一定不能有多餘的空格符;
  • 空行可以使得閱讀程式碼更加方便以及有助於程式碼的分塊。
  • 每行一定不能存在多於一條語句
  • 程式碼必須使用4個空格符的縮排,一定不能用 tab鍵
  • PHP所有關鍵字必須全部小寫
  • 控制結構的基本規範如下:
    控制結構關鍵詞後必須有一個空格。
    左括號 ( 後一定不能有空格。
    右括號 ) 前也一定不能有空格。
    右括號 ) 與開始花括號 { 間一定有一個空格。
    結構體主體一定要有一次縮排。
    結束花括號 } 一定在結構體主體後單獨成行。
    程式碼風格規範內容很多,這裡就不一一說明了,大家可自行閱讀

PSR-4 自動載入

關於由檔案路徑 自動載入 對應類的相關規範, 本規範是可互操作的,可以作為任一自動載入規範的補充,其中包括 PSR-0,此外, 本 PSR 還包括自動載入的類對應的檔案存放路徑規範。

  1. 此處的“類”泛指所有的class類、介面、traits可複用程式碼塊以及其它類似結構。

  2. 一個完整的類名需具有以下結構:

     \<名稱空間>(\<子名稱空間>)*\<類名>
    1. 完整的類名必須要有一個頂級名稱空間,被稱為 “vendor namespace”;

    2. 完整的類名可以有一個或多個子名稱空間;

    3. 完整的類名必須有一個最終的類名;

    4. 完整的類名中任意一部分中的下劃線都是沒有特殊含義的;

    5. 完整的類名可以由任意大小寫字母組成;

    6. 所有類名都必須是大小寫敏感的。

  3. 當根據完整的類名載入相應的檔案……

    1. 完整的類名中,去掉最前面的名稱空間分隔符,前面連續的一個或多個名稱空間和子名稱空間,作為“名稱空間字首”,其必須與至少一個“檔案基目錄”相對應;

    2. 緊接名稱空間字首後的子名稱空間必須與相應的”檔案基目錄“相匹配,其中的名稱空間分隔符將作為目錄分隔符。

    3. 末尾的類名必須與對應的以 .php 為字尾的檔案同名。

    4. 自動載入器(autoloader)的實現一定不能丟擲異常、一定不能觸發任一級別的錯誤資訊以及不應該有返回值。

例子

下表展示了符合規範完整類名、名稱空間字首和檔案基目錄所對應的檔案路徑。

完整類名 名稱空間字首 檔案基目錄 檔案路徑
\Acme\Log\Writer\File_Writer Acme\Log\Writer ./acme-log-writer/lib/ ./acme-log-writer/lib/File_Writer.php
\Aura\Web\Response\Status Aura\Web /path/to/aura-web/src/ /path/to/aura-web/src/Response/Status.php
\Symfony\Core\Request Symfony\Core ./vendor/Symfony/Core/ ./vendor/Symfony/Core/Request.php
\Zend\Acl Zend /usr/includes/Zend/ /usr/includes/Zend/Acl.php

暫且只介紹這比較常用的三個規範。

更多最新規範建議點選檢視


本節主要介紹了PHP的編碼規範PSR,建議大家在開發中儘量遵循此規範,特別是團隊開發的時候,我們不應該各自有著各自的編碼風格,應該儘可能統一風格。正如PHP-FIG組織的初衷所說,他們建立的規範不是限制大家的編碼自由,只是尋找共性,為了我們一起更好的協同工作。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

分享開發知識,歡迎交流。qq957042781

相關文章