編碼規范往簡單說其實就是三個方面:
放在 PHP 裡面,還有一些附加的地方,比如關鍵字大小寫,語法糖的使用(array()
與 []
等)的問題。之前整理過 PSR 的標准,也找過 php-cs-fixer 這樣的工具。這些都是規范代碼的重要手段。有統一的標准,配合上工具的檢查,形成統一的編碼約束不是什麼難題。
沒有規范,不同的人甚至同一個人在空格、換行和命名上都有可能是十分隨意的。代碼一長,回使整個文件看起來無比雜亂。
典型的例子比如:if
和 else
的組合,可以寫出無數種風格,比如:
<?php
# 單語句不寫大括號
if (true) doSomething();
# else 大括號換行 十分占篇幅
if (true)
{
doSomething();
}
else {
doElseThings();
}
# 此外還有關鍵字後不帶空格,隨意縮進等等
# ...
再比如變量函數命名的問題上,各種混搭風格層出不窮:
<?php
# 全小寫
$someparam1 = null;
# 首字母下環線
$_some_param_1 = null;
# 某些庫的類,下劃線和大小寫混用
class Abstract_ClassA
{
}
這裡並不探討各種寫法的優缺點,只是風格需要保持統一,不要混用。
如果你仔細看過 PSR 的標准,可能也會注意到某些地方其實是標准無法涉及到的。比如一個超長的表達式在什麼時候換行,如何縮進等。
這裡涉及到的就是編碼習慣的約束問題。
比如方法的鏈式的調用的問題,比如某些數據庫查詢的封裝:
<?php
# 不換行的情況下句子會很長
$result = $this->db->select('id')->where('a', 1)
->groupBy('a')->orderBy('id', 'DESC')->result();
# 這種情況下我建議是一個條件一行,保持縮進
$result = $this->db->select('id')
->where('a', 1)
->groupBy('a')
->orderBy('id', 'DESC')
->result();
還有數組定義,某些數組成員字符串很長的情況下的寫法:
<?php
$array = ['abcdefg', 'acbdfeg', 'bcadgfe', 'cdadgef'];
# 如果成員太長,我建議拆解,這樣
$array = [
'abcdefg',
'acbdfeg',
'bcadgfe',
'cdadgef',
];
寫代碼的過程中,最優的寫法和編碼習慣又不是同一件事情。這裡要說的指的是如何遵循 PHP 的語言特性或者框架的特征,充分發揮語言和框架的能力來減少冗余。
比如在獲取前端傳入的參數的時候,很多時候能見到這樣的代碼:
<?php
$param = isset($_POST['param']) ? $_POST['param'] : '';
更有甚者一些框架將前端傳入的參數封裝了一層,比如 $this->request->data['param']
,如果再去用 isset
或者 array_key_exists
判斷,整個獲取參數的語句就會變得很長。
某些情況下使用三元運算符的時候需要注意 ?:
是可以合並使用的。
其實我們應該去嘗試封裝這種寫法,防止同樣的變量出現在一個語句中多次的情況。對於默認值的賦予,可以調研框架是否有封裝提供,或者通過強制類型轉換的方式進行。
還有一種情況是條件和循環嵌套的時候。比如從數組裡抽取某一個字段,或者對某一個字段的值進行處理的時候,善用 array_map
以及引用(&
)往往能節省不少工作量。但是使用的時候也要注意數組指針最後的位置。
在根據條件返回結果時,需要善用 return
。還有就是合理的抽象與封裝。
除了以上提到的在日常開發中需要注意的一些問題。還有就是事後的工作。
我相信很多人在看自己以前的代碼的時候都有一種其實有更好的寫法的感覺。隨著時間的推移自己總會有更豐富的閱歷,更多的想法。偶爾 review 自己的代碼也是對過去的總結,也許會有新的感知。
團隊項目中,隊友的配合對整個代碼的規范起著決定性的作用。一個團隊中有一個人不遵守規范,而又要到處修改代碼的時候,很快就能破壞到所有的約束。
有統一的標准,有良好的執行力才能完成這件工作。
PHP 7革新與性能優化 http://www.linuxidc.com/Linux/2015-09/123136.htm
PHP 7 ,你值得擁有 http://www.linuxidc.com/Linux/2015-06/118847.htm
在 CentOS 7.x / Fedora 21 上面體驗 PHP 7.0 http://www.linuxidc.com/Linux/2015-05/117960.htm
CentOS 6.3 安裝LNMP (PHP 5.4,MyySQL5.6) http://www.linuxidc.com/Linux/2013-04/82069.htm
在部署LNMP的時候遇到Nginx啟動失敗的2個問題 http://www.linuxidc.com/Linux/2013-03/81120.htm
Ubuntu安裝Nginx php5-fpm MySQL(LNMP環境搭建) http://www.linuxidc.com/Linux/2012-10/72458.htm
《細說PHP》高清掃描PDF+光盤源碼+全套教學視頻 http://www.linuxidc.com/Linux/2014-03/97536.htm
CentOS 6中配置PHP的LNMP的開發環境 http://www.linuxidc.com/Linux/2013-12/93869.htm
PHP 的詳細介紹:請點這裡
PHP 的下載地址:請點這裡