PHP DIY系列–一起手寫一個api框架
創作初衷
- 有沒有用煩了CURD?
- 各種框架是不是有點頭大?
- 有沒有嘗試自己設計一個框架?
- 學了PHP語法,沒有專案去實戰,夯實基礎
希望能幫助能讓你快速地搭建一個自己的框架,能給你的工作或者學習中帶來一定的幫助與啟發。
你能學到什麼
- PSR規範
- composer的使用
- 快速搭建一個API介面框架
- Redis各種資料型別的應用
- 快取應用分析
在開發框架之前,我來介紹框架開發遵循的規範。
大多數程式語言都有自己的一套編碼規範,作為“世界上最好的語言”,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條。
我們不妨來看看這些規範:
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 還包括自動載入的類對應的檔案存放路徑規範。
此處的“類”泛指所有的class類、介面、traits可複用程式碼塊以及其它類似結構。
一個完整的類名需具有以下結構:
\<名稱空間>(\<子名稱空間>)*\<類名>
完整的類名必須要有一個頂級名稱空間,被稱為 “vendor namespace”;
完整的類名可以有一個或多個子名稱空間;
完整的類名必須有一個最終的類名;
完整的類名中任意一部分中的下劃線都是沒有特殊含義的;
完整的類名可以由任意大小寫字母組成;
所有類名都必須是大小寫敏感的。
當根據完整的類名載入相應的檔案……
完整的類名中,去掉最前面的名稱空間分隔符,前面連續的一個或多個名稱空間和子名稱空間,作為“名稱空間字首”,其必須與至少一個“檔案基目錄”相對應;
緊接名稱空間字首後的子名稱空間必須與相應的”檔案基目錄“相匹配,其中的名稱空間分隔符將作為目錄分隔符。
末尾的類名必須與對應的以
.php
為字尾的檔案同名。自動載入器(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 協議》,轉載必須註明作者和本文連結