編碼規範往簡單說其實就是三個方面:php
換行html
空格前端
變量命名git
放在 PHP 裏面,還有一些附加的地方,好比關鍵字大小寫,語法糖的使用(array()
與 []
等)的問題。以前整理過 PSR 的標準,也找過 php-cs-fixer 這樣的工具。這些都是規範代碼的重要手段。有統一的標準,配合上工具的檢查,造成統一的編碼約束不是什麼難題。github
沒有規範,不一樣的人甚至同一我的在空格、換行和命名上都有多是十分隨意的。代碼一長,回使整個文件看起來無比雜亂。數據庫
典型的例子好比:if
和 else
的組合,能夠寫出無數種風格,好比:數組
<?php # 單語句不寫大括號 if (true) doSomething(); # else 大括號換行 十分佔篇幅 if (true) { doSomething(); } else { doElseThings(); } # 此外還有關鍵字後不帶空格,隨意縮進等等 # ...
再好比變量函數命名的問題上,各類混搭風格層出不窮:php7
<?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 本身的代碼也是對過去的總結,也許會有新的感知。
團隊項目中,隊友的配合對整個代碼的規範起着決定性的做用。一個團隊中有一我的不遵照規範,而又要處處修改代碼的時候,很快就能破壞到全部的約束。
有統一的標準,有良好的執行力才能完成這件工做。
私博地址:http://0x1.im