PHP 基本程式碼規範 PSR-1(通用版)
##PHP 基本程式碼規範 PSR-1 本節我們將會討論一些基本的程式碼規範問題,以此作為將來討論更高級別的程式碼分享和技術互用的基礎。
RFC 2119中的 必須(MUST)
,不可(MUST NOT)
,建議(SHOULD)
,不建議(SHOULD NOT)
,可以/可能(MAY)
等關鍵詞將在本節用來做一些解釋性的描述。
##1. 概述
- 原始檔
必須
只使用<?php
和<?=
這兩種標籤。 - 原始檔中php程式碼的編碼格式
必須
只使用不帶位元組順序標記(BOM)
的UTF-8
。 - 一個原始檔
建議
只用來做宣告(類(class)
,函式(function)
,常量(constant)
等)或者只用來做一些引起副作用的操作(例如:輸出資訊,修改.ini
不建議
這兩件事。 名稱空間(namespace)
和類(class)
必須
遵守PSR-0標準。類名(class name)
必須
使用駱駝式(StudlyCaps)
寫法 (譯者注:駝峰式(cameCase)
的一種變種,後文將直接用StudlyCaps
表示)。類(class)
中的常量必須
只由大寫字母和下劃線(_)
組成。方法名(method name)
必須
使用駝峰式(cameCase)
寫法(譯者注:後文將直接用camelCase
表示)。
##2. 檔案
###2.1. PHP標籤
PHP程式碼必須
只使用長標籤(<?php ?>)
或者短輸出式標籤(<?= ?>)
不可
使用其他標籤。
###2.2. 字元編碼
PHP程式碼的編碼格式 必須
只使用不帶位元組順序標記(BOM)
的 UTF-8
。
###2.3. 副作用
-
一個原始檔
建議
只用來做宣告(類(class)
,函式(function)
,常量(constant)
等)或者只用來做一些引起副作用的操作(例如:輸出資訊,修改.ini
配置等),但不建議
同時做這兩件事。 -
短語
副作用(side effects)
的意思是 在包含檔案時 所執行的邏輯與所宣告的類(class)
,函式(function)
,常量(constant)
等沒有直接的關係。 -
副作用(side effects)
包含但不侷限於:產生輸出,顯式地使用require
include
,連線外部服務,修改ini配置,觸發錯誤或異常,修改全域性或者靜態變數,讀取或修改檔案等等 -
下面是一個既包含宣告又有副作用的示例檔案;即應避免的例子:
<?php
// 副作用:修改了ini配置
ini_set('error_reporting', E_ALL);
// 副作用:載入了檔案
include "file.php";
// 副作用:產生了輸出
echo "<html>\n";
//宣告
function foo()
{
// 函式體
}
- 下面是一個僅包含宣告的示例檔案;即應提倡的例子
<?php
// 宣告
function foo()
{
// 函式體
}
// 條件式宣告不算做是副作用
if (! function_exists('bar')) {
function bar()
{
// 函式體
}
}
##3. 空間名(namespace)和類名(class name)
-
名稱空間(namespace)
和類(class)
必須
遵守 PSR-0. -
這意味著一個原始檔中只能有一個
類(class)
,並且每個類(class)
至少要有一級空間名(namespace)
:即一個頂級的組織名(vendor name)
。 -
類名(class name)
必須
使用StudlyCaps
寫法。 -
PHP5.3
之後的程式碼必須
使用正式的名稱空間(namespace)
-
例子:
<?php
// PHP 5.3 及之後:
namespace Vendor\Model;
class Foo
{
}
PHP5.2.x
之前的程式碼建議
用偽名稱空間Vendor_
作為類名(class name)
的字首
<?php
// PHP 5.2.x 及之前:
class Vendor_Model_Foo
{
}
##4. 類的常量、屬性和方法
術語 類(class)
指所有的 類(class)
,介面(interface)
和 特性(trait)
###4.1. 常量
類常量 必須
只由大寫字母和 下劃線(_)
組成。
例子:
<?php
namespace Vendor\Model;
class Foo
{
const VERSION = '1.0';
const DATE_APPROVED = '2012-06-01';
}
###4.2. 屬性
本指南中故意不對 $StulyCaps
,$camelCase
或者 $unser_score
中的某一種風格作特別推薦,完全由讀者依據個人喜好決定屬性名的命名風格。
但是不管你如何定義屬性名, 建議
在一個合理的範圍內保持一致。這個範圍可能是 組織(vendor)
級別的,包(package)
級別的, 類(class)
級別的,或者 方法(method)
級別的。
###4.3. 方法
方法名則 必須
使用 camelCase()
風格來宣告。