2015/07/03

PHP-CS-Fixer On Vim

PHP 之前為人所詬病的地方就是沒有統一的撰寫風格以及結構,MVC 觀念興起後,PHP 也出了不少框架,在架構方面得到了很大的改善,但 coding style 還是存在很大的問題,假設 A 公司跟 B 公司都有自己的 convention,那還是沒有所謂的 standard 存在,所以有一個團體制定了一個標準 PHP-FIG,裡面有各種程式碼的撰寫規範,當然這是一種形式上的規範,你不照他那樣寫 PHP 也是會動,只是如果有在使用 github 套件,以及使用 MVC framework 的人,會發現知名熱門的框架幾乎都往這邊靠了,所以如果花點時間去看他的規範參考,之後你接觸其他人的東西速度會快很多。

今天要介紹的不是規範的內容,有慶去的可以去看 Apple 大的投影片,他已經把比較多重要的內容放上來了,今天我要介紹的是工具,PHP-CS-Fixer,這個工具是可以幫你整理現行的 php code,假設你公司已經有許多歷史包袱,但你很想把你看到的內容都整理成 psr-0psr-2,只要執行這個工具就可以幫你完成,我們來寫一下超不符合規定的 code。

psr.php
$name = 'Chan'; 

if($name !== '')
    echo "hi, my name is {$name}" . PHP_EOL;

for($i = 1; $i <=10; $i++){
    echo $i . PHP_EOL;
}

function test() {

}

上面的程式碼有幾個不符合規定的項目:

  • if 的寫法不可以省略 {}
  • 歪七扭八的 format 如 for( 應該要 for (
  • 結尾有多餘的 trailing white space
  • function{} 要換行

安裝好了 PHP-CS-Fixer 之後,打開 terminal 並跑去我們剛檔案的位置,執行下面的指令:

php-cs-fixer.phar fix psr.php
結果
$name = 'Chan';

if ($name !== '') {
    echo "hi, my name is {$name}".PHP_EOL;
}

for ($i = 1; $i <= 10; ++$i) {
    echo $i.PHP_EOL;
}

function test()
{
}

php-cs-fixer 預設值是跑 symphony 的結構,會改變一些東西,如 空格.空格 會變成 .for ($i = 1; $i <= 10; $i++) 會變成 for ($i = 1; $i <= 10; ++$i),但完全不會影響現行程式的運行,或許你會不喜歡,那可以加上參數 --level=psr2,這樣的結果就會做出只針對 psr2 的修正。

php-cs-fixer.phar fix psr.php --level=psr2
加上 --level=psr2 結果
$name = 'Chan';

if ($name !== '') {
    echo "hi, my name is {$name}" . PHP_EOL;
}

for ($i = 1; $i <=10; $i++) {
    echo $i . PHP_EOL;
}

function test()
{
}

不過你可以看到 psr-2 並沒有幫你把 $i <=10 變成 $i <= 10 的格式,所以可以憑自己喜好選擇,而 vim 有 vim-php-cs-fixer 可以直接支援在 vim 裡面直接使用 php-cs-fixer,安裝以後執行 <leader>pcf 表示修正目前檔案,<leader>pcd則是修正目前檔案所屬資料夾下所有的檔案,相當方便。

沒有留言: