ฟีเจอร์ใน PHP 8 ที่แม้แต่ Javascript ก็ยังไม่มี
-thumb.jpg)
แม้ 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 ได้ง่ายในระยะยาวแล้วครับ