# PSR - 1 >[name=賴晨旭] [color=red] ###### Tags: `PSR` `WEB` ## 動詞解釋 * **==必須 (MUST)== : 絕對,嚴格遵循,請照做,無條件遵守** * **==一定不可 (MUST NOT)== : 禁令,嚴令禁止** * **==應該 (SHOULD)== : 強烈建議這樣做,但是不強求** * **==不該 (SHOULD NOT)== : 強烈不建議這樣做,但是不強求** * **==可以 (MAY) 和 可選 (OPTIONAL)== : 選擇性高一點,在這個PSR內,此動詞使用較少** ## 1. 概覽 * **1. PHP 文件 ==必須== 以 ```<?php 或 <?=``` 標籤開始** * **PHP 中 ==應該== 只定義類、函數、常量等聲明,或其他會產生 副作用 的操作(如:生成文件輸出以及修改 .ini 配置文件等),二者只能選其一** * **命名空間以及類 ==必須== 符合 PSR 的自動加載規範:[PSR-4](https://learnku.com/docs/psr/psr-4-autoloader/1608) 中的一個** * **類的命名 ==必須== 遵循 StudlyCaps 大寫開頭的駝峰命名規範** * **常量所有字母都 ==必須== 大寫,單詞間用下劃線分隔** * **方法名稱 ==必須== 符合 camelCase 式的小寫開頭駝峰命名規範** ### 名詞解釋 * **StudlyCaps : 是指大小寫混用且不使用空格、連接號或底線的格式(例如 : MyFavorite)** * **常量 : 不變化的量(例如:在程式運行時,不會被程式修改的量)** * **camelCase : 小駝峰式命名法(lower camel case) : 第一個單字以小寫字母開始;第二個單字的首字母大寫(例如:firstName、lastName) 大駝峰式命名法(upper camel case) : 每一個單字的首字母都採用大寫字母, (例如 : FirstName、CamelCase,也被稱為Pascal命名法(Pascal Case))** ## 2. 文件 * **2.1. PHP 標籤** **PHP 程式碼 ==必須== 使用 ```<?php ?>``` 長標籤 或 ```<?= ?>``` 短輸出標籤 ==一定不可== 使用其它自定義標籤** * **2.2. 字符編碼** **PHP 程式碼 ==必須== 且只可使用不帶BOM的UTF-8編碼** * **2.3. 副作用** **一份 PHP 文件中 ==應該== 要不就只定義新的聲明,如類、函數或常量等不產生 ==副作用== 的操作,要不就只書寫會產生 ==副作用== 的邏輯操作,但 ==不該== 同時具有兩者。** **「副作用」(side effects) 的意思是,僅僅通過包含文件,不直接聲明class、function和常量等,而執行的邏輯操作。** **「副作用」包含卻不僅限於:** 1.生成輸出 2.直接的 require 或 include 3.連接外部服務 4.修改 ini 配置 5.拋出錯誤或異常 6.修改全局或靜態變量 7.讀或寫文件等 **以下是一個 反例,一份包含「函數聲明」以及產生「副作用」的程式碼:** ```php= <?php #「副作用」:修改 ini ini_set('error_reporting', E_ALL); #「副作用」:導入文件 include "file.php"; #「副作用」: 生成輸出 echo "<html>\n"; #宣告函数 function foo() { #函数主體 } ``` **下面是一個範例,一份只包含宣告不產生「副作用」的程式碼:** ```bash= <?php #宣告函数 function foo() { #函数主體 } #條件宣告 *不* 屬於「副作用」 if (! function_exists('bar')) { function bar() { #函数主體 } } ``` ## 3. namespace和class * **namespace以及class的命名必須遵循 PSR-4** * **根據規範,每個class都獨立為一個文件,且namespace至少有一個層次:頂級的組織名稱(vendor name)** * **class的命名 ==必須== 遵循 StudlyCaps 大寫開頭的駝峰命名規範。** * **PHP 5.3 及以後版本的代碼 ==必須== 使用正式的namespace** **範例:** ```bash= <?php #PHP 5.3及以後版本的寫法 namespace Vendor\Model; class Foo { # } ``` ## 4.class的常量、屬性和function ### 此處的「類」指代所有的類、接口以及可複用代碼塊(traits) * **4.1. 常量** **class的常量中所有字母都 ==必須== 大寫,詞間以下劃線分隔** **範例:** ```bash= <?php namespace Vendor\Model; class Foo { const VERSION = '1.0'; const DATE_APPROVED = '2012-06-01'; } ``` * **4.2. 屬性** **類的屬性命名 ==可以== 遵循:** **大寫開頭的駝峰式 ($StudlyCaps)** **小寫開頭的駝峰式 ($camelCase)** **下劃線分隔式 ($under_score)** **本規範不做強制要求,但無論遵循哪種命名方式,都 ==應該== 在一定的範圍內保持一致。這個範圍可以是整個團隊、整個包、整個類或整個方法** * **4.3** **function名稱 ==必須== 符合 camelCase() 式的小寫開頭駝峰命名規範** 參考連結:https://learnku.com/laravel/t/2078/psr-specification-psr-1-basic-coding-specification [PSR 12](https://hackmd.io/DL-qcxG6T6q6NO9IUY6TFg?both)