ฟีเจอร์ใน PHP 8 ที่แม้แต่ Javascript ก็ยังไม่มี

5 พฤศจิกายน 2566 เวลาอ่าน 2 นาที
ฟีเจอร์ใน PHP 8 ที่แม้แต่ Javascript ก็ยังไม่มี

แม้ PHP อาจจะเป็นภาษาที่เก่าแก่ถูกสร้างมานานแล้วนะครับ แต่ตัวภาษาเองก็มีการพัฒนาอย่างต่อเนื่องมาโดยตลอด ถ้าตาม Roadmap แล้วมีการปล่อยเวอร์ชันย่อยออกมาตลอดทุกปี ตั้งแต่การเพิ่มพวก Type Checking, Just-In-Time Complation ที่ช่วยให้เพิ่ม Performance ให้ทันกับภาษาอื่น ๆ ที่อาจเคยมีข้อได้เปรียบทางด้านประสิทธิภาพมากกว่า PHP

ทีนี้ใน PHP 8 ก็มีพวก syntax หรือ ฟีเจอร์ทางภาษาบางอย่างที่แม้แต่ Javascript เองก็ยังไม่มี พวก Syntax เหล่านี้ถ้าเรารู้จักใช้ให้ถูกตามวัตถุประสงค์ก็ช่วยให้ Code ที่เราเขียนดู Clean อ่านง่าย Flow ในการเขียน Code ของเราดูกระชับทำความเข้าใจได้ง่ายมากขึ้นเลยครับ

#1 Named Arguments การเรียกชื่อ parameter ที่ส่ง

สมมุติถ้าเรามี ฟังก์ชันประมาณนี้

function savePost(Post $post, bool $isSticky = false, string $imagePath = null) {
   // ....
}

ถ้าเราต้องการเรียกฟังก์ชัน savePost แต่ต้องการส่งแค่ $post กับ $imagePath เราสามารถเรียกฟังก์ชันแบบนี้ได้

savePost(post: $post, imagePath: $path);

สังเกตว่า เราไม่จำเป็นต้องส่ง $isSticky เข้าไปในฟังก์ชัน โดยเราสามารถ skip paramater ที่เป็น optional ได้โดยไม่ต้อง ส่ง false ไป 

ฟีเจอร์นี้จะมีประโยชน์มากสำหรับฟังก์ชันที่สามารถรับพารามิเตอร์ได้หลายตัว 4-5 ตัวขึ้นไป แล้วเรามักจะจำลำดับไม่ค่อยได้ว่า parameter แต่ละตัวต้องระบุลำดับที่เท่าไหร่ เราก็สามารถ skip parameter ทั้งหมด ส่งตัวท้าย ๆ ที่เราต้องการได้เลย

แต่ถ้าเป็น Javascript เราไม่สามารถ skip parameter แบบนี้ได้ ถ้าจะเรียกฟังก์ชันประมาณเดียวกันใน JavaScript เรายังคงต้องเรียกให้ครบทุกตัวแบบนี้ครับ

savePost(post, false, 'path/to/mage')

จริงอยู่เราสามารถ design ฟังก์ชันใหม่ ให้รับเป็น json object แล้วใช้พวก destruct แตก opject ส่งเฉพาะ parameter ที่เราต้องการใช้จริง ๆ ได้ แต่บางทีถ้ามีฟีเจอร์ที่รองรับจากภาษาโดยตรงก็สะดวกดีครับ

#2 Match Expression

Match Expression เป็น syntax ใหม่ใน PHP 8 ที่ผมใช้งานค่อนข้างบ่อยพอสมควรเลยครับ โดย คำสั่ง match จะเอามาใช้งานแทน array lookup หรือคำสั่ง Switch ได้ในหลาย ๆ case (😎) เลยทีเดียว

ตัวอย่างการใช้ Match

$color = match ($state) {
   'draft' => 'gray'
   'active', 'complete', 'done' => 'primary',   
   default => 'secondary'
}

จากตัวอย่างถ้าเราจะเขียนโดยใช้ switch ใน JavaScript ก็จะต้องเขียนประมาณนี้ครับ

let color;
switch (state) {
  case 'draft':
    color = 'gray';
    break;
  case 'active':
  case 'complete':
  case 'done':
    color = 'primary';
    break;
  default:
    color = 'secondary'
    break;
}

จะเห็นได้ว่าคำสั่ง match Code ดูสั้นและกระชับมากกว่าเยอะเลยใช่มั้ยครับ

https://www.php.net/manual/en/control-structures.match.php 

#3 Nullsafe Operator การเรียก object แบบต่อ ๆ กัน

ปกติถ้าเราเรียก เมธอด ที่มีการ return object ซ้อน ๆ กันหลายชั้น ถ้า Object ก่อนหน้าเป็น null method ที่เราเรียกมันจะ error เราสามารถใช้ Nullsafe Operator (?->) เพื่อหยุดการ chain method ได้ถ้า object เป็น null ตามตัวอย่างนี้ครับ 

$company = auth()->user()?->getDepartment()?->getCompany();

สังเกตว่าถ้าสมมุติเรียก user() หรือ getDepartment() ตรงไหนก็ตามเป็น null แล้ว code เราก็จะไม่ error แล้วครับ

แต่ถ้าเป็น Javascript เรายังต้องคอยเช็คแต่ละ step ก่อนว่า ค่าเป็น null มั้ยแล้วค่อยเรียก method ถัดไป 

let company = auth().user() && auth().user() && auth().user().getDepartment() && auth().user().getDepartment().getCompany()
? auth().user().getDepartment().getCompany()
: null;

RFC: https://wiki.php.net/rfc/nullsafe_operator 

สรุป

ทีนี้เราก็ได้เห็นฟีเจอร์บางส่วนของ PHP 8 ที่ก็มีจุดเด่นไม่แพ้ภาษาอื่น ๆ แต่ไม่ว่าเราจะใช้ภาษาไหนถ้าเรามีความรู้ความเข้าใจในภาษาใช้ประโยชน์จาก Syntax หรือ function ของภาษาให้ถูกจุด ก็จะช่วยลดความซับซ้อนของ code เราให้อ่านง่ายและ maintain ได้ง่ายในระยะยาวแล้วครับ

เรื่องใน
PHP
Phattarachai Chaimongkol

เกี่ยวกับ phattarachai.dev

ผมอ๊อฟนะครับ เป็นผู้ประกอบการอิสระ ที่ปรึกษาทางด้าน Web Application Development ให้แก่องค์กร ธุรกิจ SME และหน่วยงานราชการ
Web Developer ผู้มีใจรักใน Laravel เป็นพาร์ทเนอร์บริษัท Digital Agency ชั้นนำทางด้าน UX/UI เพื่อพัฒนาโปรเจคให้แก่ลูกค้า ผมช่วยสร้างเครื่องมือทางด้าน Web ที่มีคุณภาพให้ผู้ประกอบการดำเนินธุรกิจได้ง่ายขึ้นใช้งานได้จริง เน้นประสบการณ์ ความชำนาญ ผลงานคุ้มค่าเทียบเท่าจ้างงานกับบริษัทใหญ่ ๆ

ยามว่าง ๆ ชอบเล่นเกมส์บน Steam ครับ

เรื่องที่เกี่ยวข้อง

PHP function แสดงขนาดไฟล์แบบคนอ่านรู้เรื่อง เป็น KB, MB, GB
5 พฤศจิกายน 2566
PHP function แสดงขนาดไฟล์แบบคนอ่านรู้เรื่อง เป็น KB, MB, GB
คำสั่ง Postgresql ที่เอาไว้ใช้จัดการเกี่ยวกับ Replication
5 พฤศจิกายน 2566
คำสั่ง Postgresql ที่เอาไว้ใช้จัดการเกี่ยวกับ Replication
สรุป Taylor Otwell Keynote ใน Laracon US 2024 - Inertia 2.0, VS Code Extension และ Laravel Cloud
5 พฤศจิกายน 2566
สรุป Taylor Otwell Keynote ใน Laracon US 2024 - Inertia 2.0, VS Code Extension และ Laravel Cloud