ป้ายกำกับ: Null Handling Operators

PHP Syntax Sugar: เขียนโค้ดให้สั้น กระชับ และโมเดิร์นแบบโปรPHP Syntax Sugar: เขียนโค้ดให้สั้น กระชับ และโมเดิร์นแบบโปร

หากคุณไม่ได้เขียน PHP มานาน หรืออยากจะอัปเกรดโค้ดเก่า (Legacy Code) ให้ดูสะอาดตาและอ่านง่ายขึ้น สิ่งแรกที่ต้องทำความรู้จักคือ Syntax Sugar Syntax Sugar ไม่ใช่ฟีเจอร์ใหม่ที่เปลี่ยนพฤติกรรมการทำงานของระบบ แต่เป็น “ไวยากรณ์ที่ออกแบบมาเพื่อเอาใจนักพัฒนา” ช่วยให้เราเขียนโค้ดได้สั้นลง ลดความซ้ำซาก (Boilerplate) และลดโอกาสการเกิด Bug โดยที่เบื้องหลังการทำงาน (Under the hood) คอมไพเลอร์ยังคงประมวลผลเหมือนเดิมทุกประการ

บทความนี้ได้รวบรวม Syntax Sugar ทั้งหมดที่สำคัญใน PHP ยุคใหม่ (PHP 7.4 จนถึง PHP 8.x) มาให้คุณได้อัปเดตแบบม้วนเดียวจบครับ


1. กลุ่มตัวดำเนินการจัดการค่า Null (Null Handling Operators)


ปัญหาคลาสสิกของคนเขียน PHP คือการคอยเช็ค isset() หรือเช็ค !== null เพื่อไม่ให้โค้ดพัง ปัจจุบัน PHP มีตัวช่วยที่ทำให้โค้ดสั้นลงมาก

1.1 Null Coalescing Operator (??)

ใช้สำหรับเช็คว่าตัวแปรฝั่งซ้ายมีอยู่จริงและไม่เป็น null หรือไม่ ถ้าใช่ให้ใช้ค่านั้น แต่ถ้าไม่มีให้ใช้ค่า Default ฝั่งขวาทันที (ยุบ isset() + Ternary รวมกัน)

  • เมื่อก่อน
    $username = isset($_GET['user']) ? $_GET['user'] : 'anonymous';
    
  • ปัจจุบัน
    $username = $_GET['user'] ?? 'anonymous';
    

1.2 Null Coalescing Assignment Operator (??=)

ต่อยอดจากข้อข้างบน ถ้าตัวแปรฝั่งซ้ายเป็น null หรือยังไม่ได้ประกาศ ให้ทำการ Assign ค่าฝั่งขวาเข้าไปในตัวแปรนั้นทันที

  • เมื่อก่อน
    if (!isset($data['role'])) {
        $data['role'] = 'guest';
    }
    
  • ปัจจุบัน
    $data['role'] ??= 'guest';
    

1.3 Nullsafe Operator (?->)

หมดปัญหา Call to a member function on null เวลาดึงข้อมูลจาก Object ที่ต่อกันเป็นทอดๆ ถ้าตัวใดตัวหนึ่งในเส้นทางเป็น null มันจะหยุดทำงานและคืนค่า null กลับมาทันทีโดยไม่พ่น Error พังพินาศ

  • เมื่อก่อน
    $country = null;
    if ($user !== null) {
        $profile = $user->getProfile();
        if ($profile !== null) {
            $country = $profile->country;
        }
    }
    
  • ปัจจุบัน
    $country = $user?->getProfile()?->country;
    

2. กลุ่มลดรูปฟังก์ชันและบล็อกเงื่อนไข (Functions & Expressions)


2.1 Arrow Functions (fn() =>)

เป็นการลดรูปการเขียน function() แบบสั้น เหมาะมากสำหรับฟังก์ชันบรรทัดเดียว (เช่น การใช้ร่วมกับ array_map หรือ array_filter) ความเจ๋งคือมันจะทำการ Capture ตัวแปรจาก Scope ด้านนอกให้อัตโนมัติ โดยที่เราไม่ต้องเขียน use ($variable) อีกต่อไป

  • เมื่อก่อน
    $multiplier = 3;
    $numbers = array_map(function($n) use ($multiplier) {
        return $n * $multiplier;
    }, [1, 2, 3]);
    
  • ปัจจุบัน
    $multiplier = 3;
    $numbers = array_map(fn($n) => $n * $multiplier, [1, 2, 3]);
    

2.2 Match Expression (match)

เป็นร่างพัฒนาขั้นสุดของ switch-case นอกจากจะเขียนสั้นกว่าและไม่ต้องใส่ break; ในทุกๆ บรรทัดแล้ว match ยังเป็น Expression ที่สามารถส่งค่ากลับมา (Return value) ไปใส่ตัวแปรได้โดยตรง และการเช็คค่าจะเป็นแบบเข้มงวด (Strict Comparison ===)

  • เมื่อก่อน
    switch ($statusCode) {
        case 200:
            $message = 'Success';
            break;
        case 404:
            $message = 'Not Found';
            break;
        default:
            $message = 'Unknown Status';
    }
    
  • ปัจจุบัน
    $message = match ($statusCode) {
        200 => 'Success',
        404 => 'Not Found',
        default => 'Unknown Status',
    };
    

3. กลุ่มการจัดการโครงสร้างข้อมูล (Data & Object Oriented)


3.1 Constructor Property Promotion

ฟีเจอร์นี้ช่วยล้างบางโค้ดซ้ำซาก (Boilerplate) ในการสร้าง Class ยุคก่อนเราต้องประกาศ Property ด้านบน, รับค่าใน Constructor, แล้วเอามา Assign ค่าซ้ำอีกรอบ ปัจจุบันเราสามารถยุบรวมทั้งหมดไว้ที่ Parameter ของ Constructor ได้เลย!

  • เมื่อก่อน
    class Product {
        public string $name;
        public float $price;
    
        public function __construct(string $name, float $price) {
            $this->name = $name;
            $this->price = $price;
        }
    }
    
  • ปัจจุบัน
    class Product {
        public function __construct(
            public string $name,
            public float $price,
        ) {}
    }
    

3.2 Array Destructuring ([])

ไวยากรณ์ย่อสำหรับการดึงค่าออกจาก Array มากระจายใส่ตัวแปรต่างๆ แทนการใช้ฟังก์ชัน list() แบบดั้งเดิม

  • เมื่อก่อน
    $coordinates = [10.5, 20.8];
    list($lat, $lng) = $coordinates;
    
  • ปัจจุบัน
    $coordinates = [10.5, 20.8];
    [$lat, $lng] = $coordinates;
    

3.3 Spread Operator ใน Array (...)

ช่วยในการแกะสมาชิกใน Array ตัวหนึ่งไปกระจายใส่อีก Array หนึ่ง (หรือจะใช้อ่านค่า Argument ของฟังก์ชันก็ได้) ช่วยทดแทนการใช้ array_merge() ได้เป็นอย่างดี

  • เมื่อก่อน
    $fruits = ['apple', 'banana'];
    $allFoods = array_merge(['rice', 'bread'], $fruits, ['milk']);
    
  • ปัจจุบัน
    $fruits = ['apple', 'banana'];
    $allFoods = ['rice', 'bread', ...$fruits, 'milk'];
    

4. ลูกเล่นเล็กๆ น้อยๆ แต่ช่วยได้เยอะ (Miscellaneous Sugar)


4.1 Numeric Literal Separator (_)

สำหรับตัวเลขที่มีค่ามากๆ เราสามารถใช้เครื่องหมาย Underscore (_) มาคั่นสายตาเพื่อให้มนุษย์อ่านง่ายขึ้นได้ โดยตอนที่ PHP นำโค้ดไปรัน มันจะมองข้ามเครื่องหมายนี้ไปโดยอัตโนมัติ

  • เมื่อก่อน
    $budget = 5000000000; // ต้องคอยเพ่งและนับเลขศูนย์
    
  • ปัจจุบัน
    $budget = 5_000_000_000; // อ๋อ! 5 พันล้าน อ่านง่ายขึ้นทันที
    

4.2 Trailing Commas

PHP ยุคใหม่ยอมให้เราใส่เครื่องหมายจุลภาค (Comma ,) ปิดท้ายรายการสุดท้ายใน Array หรือ Parameter ของฟังก์ชันได้แล้ว ข้อดีคือเวลาเรา Git commit เพิ่มบรรทัดใหม่ มันจะไม่ขึ้นบรรทัดสีแดงว่าเราไปแก้ไขบรรทัดก่อนหน้าเพื่อเติม Comma

$config = [
    'host' => 'localhost',
    'port' => 3306, // สามารถใส่ Comma ปิดท้ายตรงนี้ได้เลย แม้ไม่มีสมาชิกต่อแล้ว
];

สรุป

การเลือกใช้ Syntax Sugar เหล่านี้ นอกจากจะทำให้โค้ดของคุณดูเป็นมืออาชีพและเข้ากับยุคสมัยปัจจุบันแล้ว มันยังส่งผลดีต่อตัวคุณและทีมในแง่ของ Maintainability (การบำรุงรักษาโค้ด) เพราะโค้ดที่สั้นและกระชับ ย่อมหมายถึงจุดที่อาจเกิด Bug น้อยลง และใช้เวลาในการอ่านทำความเข้าใจลดลงนั่นเองครับ


อ่านเพิ่มเติม