排版

程式碼越靠左邊就越平易近人

限制每行字數

寫程式推薦的寬度是每行 80 ~ 120 字,即便有外接大螢幕,也不建議超過這個數字。


換行

程式碼越往右邊就意味著該行要判斷的事情越複雜,且不容易閱讀上下文

// bad code, 條件太長了
if ($conditions['status'] === true && $conditions['is_test'] === false && $conditions['type'] === 'boolean') {
    echo 'hello';
}
// good code, 換行,這種方式還能寫註解
if ($conditions['status'] === true
 && $conditions['is_test'] === false
 && $conditions['value'] === 'hello') {
    echo 'hello';
}
// good code, 萃取出新的方法
if ($this->canEcho($conditions)) {
    echo 'hello';
}

使用匿名函式

// bad code
collect($products)->map(function($product) use ($request) {
    return [
        'id' => $product->id,
        'name' => $product->name,
        'status' => $product->status && $request->can_display
    ]
});

// good code
collect($products)->map(fn($product) => [
    'id' => $product->id,
    'name' => $product->name,
    'status' => $product->status && $request->can_display
]);

三元運算子正確用法

如果結果是單數,請換行

// 變數
$name = $displayName
        ? $product->name
        : '商品';
// 陣列
[
    'name' => $displayName
        ? $product->name
        : '商品'
];

如果是 null 或 array,可以這樣寫

// 變數
$coupon = empty($coupon) ? null : [
    'id' => $coupon->id,
    'name' => $coupon->name
];
// 陣列
[
    'coupon' => empty($coupon) ? null : [
        'id' => $coupon->id,
        'name' => $coupon->name
    ]
];

如果輸出結果是兩組陣列,還是建議抽出去做

// 變數
$coupon = $coupon['default'] === 'default' 
    ? $this->formatDefaultCoupon($coupon)
    : $this->formatCoupon($coupon);
// 陣列
[
    'coupon' => $coupon['default'] === 'default' 
        ? $this->formatDefaultCoupon($coupon)
        : $this->formatCoupon($coupon)
    ]
];

使用雙引號或 Heredoc

雙引號和 Heredoc 可以解析變數,如果沒有變數需求則使用單引號

// 雙引號
"{$product['name']}, is {$this->getColor($product)}"
// heredoc, 可以直接換行
<<<MESSAGE
{$product['name']}, is {$this->getColor($product)}
MESSAGE;

Last updated