PSR-12 Extended Coding Style

มาตรฐานการจัดรูปแบบโค้ด PHP ที่ทุกคนควรใช้ — แทนที่ PSR-2 ที่ deprecated แล้ว

📌 PSR-12 เป็นมาตรฐานที่ใช้แทน PSR-2 ตั้งแต่ปี 2019 ถ้าคุณเคยอ่าน PSR-2 มาก่อน ให้ลืมไปได้เลยครับ ใช้ PSR-12 แทน

ทำไมต้อง PSR-12?

เคยเจอไหมครับ ทำงานเป็นทีม แล้วเปิดโค้ดของเพื่อนมาดู... อ่านไม่รู้เรื่องเลย

ไม่ใช่เพราะโค้ดมันยาก แต่เพราะ แต่ละคนเขียนคนละ style — คนนึงใช้ tab คนนึงใช้ space, คนนึงเปิดปีกกา { บรรทัดเดียวกับ function คนนึงขึ้นบรรทัดใหม่

PSR-12 มาแก้ปัญหานี้ครับ มันกำหนดว่า "โค้ด PHP ที่ดี ควรจัดรูปแบบยังไง" ให้เป็นมาตรฐานเดียวกัน


1. พื้นฐานที่ต้องรู้ก่อน

ก่อนจะไปเรื่องอื่น ให้จำ 3 อย่างนี้ไว้เลยครับ

  • ใช้ 4 spaces สำหรับ indentation (ห้ามใช้ tab เด็ดขาด)

  • 1 บรรทัดไม่ควรเกิน 120 ตัวอักษร (soft limit) แต่พยายามอย่าเกิน 80 จะดีที่สุด

  • ท้ายไฟล์ต้องมีบรรทัดว่าง 1 บรรทัด และห้ามมี ?> ปิดท้าย

<?php

namespace App\Services;

use App\Contracts\PaymentGateway;
use App\Models\Order;

class PaymentService
{
    // โค้ดของเรา...
}
// ← บรรทัดว่างท้ายไฟล์

💡 Best Practice: ตั้งค่า editor ให้ใส่ newline ท้ายไฟล์อัตโนมัติเลยครับ ใน VS Code ตั้ง "files.insertFinalNewline": true


2. การประกาศ Namespace และ Use

ลำดับการเขียนด้านบนของไฟล์ ต้องเป็นแบบนี้เสมอครับ

สังเกตนะครับ ต้องมีบรรทัดว่างคั่นระหว่างแต่ละกลุ่ม เสมอ

💡 Best Practice: ใช้ declare(strict_types=1); ทุกไฟล์เลยครับ มันช่วยจับ bug เรื่อง type ได้เยอะมาก


3. Class, Property และ Method

มาถึงส่วนที่เขียนบ่อยที่สุดครับ

3.1 การประกาศ Class

จุดสำคัญ:

  • extends และ implements อยู่บรรทัดเดียวกับชื่อ class

  • เปิด { ขึ้นบรรทัดใหม่ (ต่างจาก if/for ที่อยู่บรรทัดเดียวกัน)

  • ลำดับในคลาส: use traits → constants → properties → constructor → methods

3.2 ถ้า implements เยอะมาก

ขึ้นบรรทัดใหม่แล้ว indent เข้ามา 1 ชั้นครับ


4. Control Structures (if, for, switch)

ส่วนนี้คนเขียนผิดกันเยอะมากครับ มาดูทีละตัวเลย

4.1 If / Elseif / Else

สังเกตนะครับ:

  • เปิด { อยู่บรรทัดเดียวกัน (ไม่เหมือน class ที่ขึ้นบรรทัดใหม่)

  • ใช้ elseif ไม่ใช่ else if (คำเดียว)

  • มี space หลัง if และก่อน { เสมอ

4.2 Switch

💡 Best Practice: ถ้า case ไหนตั้งใจจะ fall-through (ไม่มี break) ให้ comment // no break ไว้ด้วยครับ เพื่อให้คนอ่านรู้ว่าไม่ได้ลืม

4.3 For / Foreach / While

ทุกตัวเหมือนกันครับ — เปิด { บรรทัดเดียวกัน, มี space รอบ keywords


5. Method และ Function Parameters

5.1 Parameter สั้นๆ

5.2 Parameter ยาวๆ (เกิน 120 ตัวอักษร)

สังเกตนะครับ:

  • parameter แต่ละตัวขึ้นบรรทัดใหม่ indent เข้า 1 ชั้น

  • ปิด ) กับเปิด { อยู่บรรทัดเดียวกัน

  • trailing comma หลังตัวสุดท้ายได้ (PHP 8.0+)

💡 Best Practice: ใช้ trailing comma เสมอครับ เวลาเพิ่ม parameter ใหม่ git diff จะสะอาดมาก


6. Closure (Anonymous Function)

ถ้ามี use:

Arrow Function (PHP 7.4+)

สั้นกว่าเยอะเลยครับ ถ้า logic ไม่ซับซ้อน แนะนำใช้ arrow function


7. Return Type Declaration

💡 Best Practice: ใส่ return type ทุก method เลยครับ มันช่วยให้ IDE autocomplete ได้ดีขึ้น และจับ bug ได้เร็วขึ้นมาก


8. Operators

เรื่องเล็กแต่สำคัญครับ — ต้องมี space รอบ operator เสมอ

ยกเว้น string concatenation ที่มีหลายบรรทัด ให้จุด . อยู่ต้นบรรทัดถัดไป:


9. Nullable Type และ Union Type

สังเกตนะครับ ? ติดกับ type ไม่มี space, | และ & ก็ไม่มี space เช่นกัน


10. ตั้งค่าให้จัดการอัตโนมัติ

เรื่องทั้งหมดนี้ไม่ต้องจำหมดครับ เพราะมีเครื่องมือช่วย

PHP CS Fixer (แนะนำ)

สร้างไฟล์ .php-cs-fixer.php ที่ root ของโปรเจกต์:

แล้วรัน:

💡 Best Practice: ตั้ง pre-commit hook ให้รัน php-cs-fixer อัตโนมัติทุกครั้งที่ commit ครับ จะได้ไม่ต้องมานั่งเถียงเรื่อง style กันในทีม

Laravel Pint (สำหรับ Laravel)

ถ้าใช้ Laravel อยู่แล้ว ใช้ Pint ได้เลยครับ มันมาพร้อม Laravel ตั้งแต่ v9:

Pint ใช้ PSR-12 เป็น default อยู่แล้ว สะดวกมากครับ


สรุป

ถ้าให้จำแค่ไม่กี่ข้อ จำแค่นี้ก็พอครับ:

  • 4 spaces ไม่ใช่ tab

  • เปิด { — class/method ขึ้นบรรทัดใหม่, control structure อยู่บรรทัดเดียวกัน

  • Space รอบ operator, หลัง keyword (if, for, foreach)

  • ใช้ elseif ไม่ใช่ else if

  • Return type ใส่ทุก method

  • ใช้ PHP CS Fixer หรือ Pint จัดการให้อัตโนมัติ — อันนี้สำคัญที่สุด

จำไม่หมดก็ไม่เป็นไรครับ แค่ตั้ง tool ให้จัดการให้ แล้วโค้ดเราก็จะเป็นมาตรฐานเดียวกับคนทั้งโลกแล้ว 😄

Last updated