ฟีเจอร์ใหม่ใน PHP 8.5
(stitcher.io)- PHP 8.5 เป็นอัปเดตใหญ่ที่มาพร้อมหลายฟีเจอร์ เช่น pipe operator, clone with, และ URI parser แบบใหม่
- pipe operator ช่วยให้การเชื่อมต่อชุดการเรียกฟังก์ชันง่ายขึ้น เพิ่มทั้งความอ่านง่ายและการดูแลรักษาโค้ด
- ฟีเจอร์ Clone with ทำให้สามารถเปลี่ยนค่าพร็อพเพอร์ตีไปพร้อมกับการคัดลอกอ็อบเจ็กต์ได้ แต่มีข้อจำกัดบางอย่างกับ readonly properties
- เพิ่มความสะดวกให้นักพัฒนาด้วย
#[NoDiscard],(void)cast, รองรับ closure ใน constant expression, และ การแสดง backtrace ของ fatal error - เวอร์ชันนี้ยังรวมถึงการปรับปรุงรายละเอียด เช่น การจัดการอาร์เรย์, การตรวจสอบ attribute, การเลิกใช้ cast ที่ไม่เป็นมาตรฐาน และ การเปลี่ยนแปลงด้าน backward compatibility
ฟีเจอร์ใหม่หลัก
-
เพิ่ม pipe operator (
|>) ทำให้เขียนโค้ดแบบ chain โดยส่งผลลัพธ์ของฟังก์ชันหนึ่งไปยังฟังก์ชันถัดไปได้โดยตรง- รองรับโครงสร้างการแปลงข้อมูลทีละขั้น แทนการเรียกฟังก์ชันซ้อนกัน
- ตัวอย่างโค้ดใช้
trim,str_replace,strtolowerและฟังก์ชันอื่น ๆ ต่อกันตามลำดับ
-
ฟีเจอร์ Clone with ช่วยให้เปลี่ยนค่าพร็อพเพอร์ตีได้พร้อมกับการคัดลอกอ็อบเจ็กต์
- ในคลาสตัวอย่าง
Bookใช้งานในรูปแบบclone($this, ['title' => $title]) - แต่หากคัดลอก readonly properties จากภายนอก จะต้องมีตัวกำหนดการเข้าถึง
public(set)
- ในคลาสตัวอย่าง
-
เพิ่ม attribute
#[NoDiscard]และ(void)cast- สามารถระบุฟังก์ชันที่ต้องการให้มีคำเตือนเมื่อมีการละทิ้งค่าที่คืนกลับมา
- และสามารถใช้
(void)cast เพื่อระงับคำเตือนได้
-
ปรับปรุง closure ให้สามารถใช้ closure และ first-class callable ภายใน constant expression ได้
- ตัวอย่างใช้ในรูปแบบ
#[SkipDiscovery(static function (...))]ภายใน attribute - closure ลักษณะนี้ต้องประกาศเป็น
staticและไม่สามารถเข้าถึงตัวแปรภายนอกได้
- ตัวอย่างใช้ในรูปแบบ
-
เพิ่มฟีเจอร์ การแสดง backtrace ของ fatal error
- จากเดิมที่ไม่แสดง ตอนนี้ stack trace จะถูกรวมอยู่ในข้อความ error ทำให้ดีบักได้ง่ายขึ้น
ฟีเจอร์เกี่ยวกับอาร์เรย์และ URI
-
เพิ่มฟังก์ชัน
array_first()และarray_last()- ใช้คืนค่า element ตัวแรกและตัวสุดท้ายของอาร์เรย์ได้อย่างง่ายดาย
- แทนวิธีที่ซับซ้อนกว่าเดิมที่ต้องอาศัย
array_key_first()และarray_key_last()
-
เพิ่ม URI parser แบบใหม่
- ผ่านคลาส
Uri\Rfc3986\Uriที่มีเมธอดอย่างgetHost(),getScheme(),getPort()เป็นต้น - ช่วยให้การจัดการและวิเคราะห์ URI ง่ายขึ้น
- ผ่านคลาส
ฟีเจอร์ด้าน attribute และการตรวจสอบ
- เพิ่ม attribute
#[DelayedTargetValidation]- ช่วยเลื่อนจังหวะการตรวจสอบ attribute บางตัว เช่น
#[Override]จาก compile time ไปเป็น runtime - มีเป้าหมายเพื่อบรรเทาปัญหาด้าน backward compatibility
- ช่วยเลื่อนจังหวะการตรวจสอบ attribute บางตัว เช่น
การเปลี่ยนแปลงย่อยอื่น ๆ
- รองรับ asymmetric visibility สำหรับ static property
- สามารถใส่ attribute ให้กับ constant นอกคลาส ได้
- constructor property promotion ใช้กับ final property ได้แล้ว
- สามารถใช้ attribute
#[\Override]กับ property ได้ด้วย - เพิ่มพร็อพเพอร์ตี Dom\Element::$outerHTML
- ส่วนขยาย Exif รองรับ ภาพ HEIF/HEIC
- เพิ่มแฟล็ก
FILTER_THROW_ON_FAILUREในการเรียกfilter_var()
การเลิกใช้และการเปลี่ยนแปลงที่ไม่เข้ากัน
- เลิกใช้ ชื่อ cast ที่ไม่เป็นมาตรฐาน เช่น
(boolean),(integer) - เลิกใช้ การใช้ backtick(```) เป็น alias ของ
shell_exec() - เลิกใช้ฟีเจอร์ การประกาศ constant ซ้ำ
- ลบการตั้งค่า ini
disabled_classes - ดูรายการการเปลี่ยนแปลงและสิ่งที่เลิกใช้ทั้งหมดได้ใน เอกสารอัปเกรด PHP 8.5
สรุปภาพรวม
- PHP 8.5 เป็นเวอร์ชันที่ยกระดับประสบการณ์การพัฒนาโดยรวม ทั้งด้าน ความอ่านง่ายของโค้ด, การดีบัก, การจัดการ attribute และการจัดการอาร์เรย์
- pipe operator และ URI parser ส่งผลโดยตรงต่อการทำให้โค้ดในการทำงานจริงเรียบง่ายขึ้น
- การเปลี่ยนแปลงอย่าง การเลื่อนการตรวจสอบ attribute, ฟังก์ชันอาร์เรย์ใหม่, และการแสดง backtrace ช่วยเพิ่มทั้งความสามารถในการดูแลรักษาและความเสถียร
- มีการเลิกใช้ ไวยากรณ์และการตั้งค่าที่ไม่เป็นมาตรฐาน บางส่วน จึงอาจต้องปรับปรุงโค้ด
- โดยรวมแล้วนี่คือรีลีสที่เน้น ความสอดคล้องของภาษาและความสะดวกของนักพัฒนา
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ฉันยังคงรัก PHP อยู่เสมอ
เมื่อ 23 ปีก่อนฉันทำซอฟต์แวร์เข้ารหัสสำหรับ PHP และมันก็ยังใช้งานได้ดีอยู่จนถึงตอนนี้
ตอนนี้ก็ยังทำจดหมายข่าวเกี่ยวกับ PHP อยู่ และชุมชนก็ยังแข็งแกร่งเหมือนเดิม
ฉันใช้ทั้ง Python และ Node.js แต่ถ้าเป็นงานที่เร็วและเรียบง่าย สุดท้ายก็มักจะกลับมาที่ PHP
แต่หลังจาก PHP 5 เป็นต้นมา ภาษานี้ก็ ซับซ้อนขึ้นมาก ซึ่งก็ดูเป็นดาบสองคม
ในช่วงที่ Python เปลี่ยนจาก 2 ไป 3 นั้น PHP ก็พัฒนาจาก 5.2→5.3 และ 5.6→7.0
ทั้ง namespace, การ autoload แบบ PSR0, และการปรับปรุง parser ทำให้ทั้งความเร็วและโครงสร้างดีขึ้นมาก
ในแต่ละอัปเดตก็ค่อย ๆ ปรับปรุงโดยไม่ทำลายความเข้ากันได้ และยังมีคำเตือนกับ shim ให้สามารถประคองเวอร์ชันเก่าไว้ได้
การยกเลิก PHP 6 เกิดจากการเปลี่ยนวิธีจัดการสตริง แต่สุดท้ายฉันมองว่าเป็นการตัดสินใจที่ฉลาด
มันเป็นทั้งภาษาและโปรเจ็กต์ชุมชนที่ฉันเคารพ เพราะดูแลปากท้องฉันมานานมาก
จะเขียนให้ซับซ้อนก็ได้ แต่ไม่จำเป็นต้องทำแบบนั้น
ช่วงกลางยุค 2000 ฉันเคยใช้เครื่องมือเกี่ยวกับ Zend และจำได้ว่าค่อนข้างจุกจิกทีเดียว
ถ้าเรียน PSR และคำนึงถึงเรื่องความปลอดภัยกับความสามารถต่าง ๆ มันก็กลายเป็น ภาษาที่เสถียรและทรงพลังขึ้นมาก
วิวัฒนาการหลัง PHP 5 น่าประทับใจ แต่ในขณะเดียวกันก็มีปัญหาเรื่อง ความซับซ้อนที่เพิ่มขึ้น ด้วย
สำหรับคนที่เคยเรียนจากเวอร์ชันเก่า โค้ดเบสสมัยใหม่อาจดูแปลกและตามได้ยาก
นี่เป็นจุดแข็งของชุมชน แต่ก็เป็นกำแพงสำหรับนักพัฒนาที่อยากกลับมาใช้อีกครั้ง
ฉันใช้ C++ มา 10 ปี แต่ตอนนี้ PHP อ่านง่ายกว่าโค้ด C++ สมัยใหม่เยอะ
เหมือนเป้าหมายเรื่องความเรียบง่ายหายไป แล้วมีแต่การเพิ่มฟีเจอร์เข้าไปเรื่อย ๆ
โดยเฉพาะสายเว็บที่เปลี่ยนเร็วมาก ถ้าไม่ตามก็จะตามไม่ทัน
PHP เป็นภาษาที่คนเริ่มต้นใช้ทำเว็บไซต์แรกของตัวเองกันเยอะ เลยอาจรู้สึกถึงความเปลี่ยนแปลงได้ชัดกว่าภาษาอื่น
หลายคนมีแนวโน้มจะ รู้สึกอายกับ PHP แต่ฉันไม่เป็นแบบนั้น
ฉันไม่ได้รู้ลึกเรื่องภาษา แต่รู้ว่ามีโปรเจ็กต์เจ๋ง ๆ มากมาย
โปรเจ็กต์ PHP ที่ฉันชอบที่สุดช่วงนี้คือ BookStack ซึ่งฉันใช้เป็นวิกิสำหรับครอบครัว
ทุกวันนี้ก็ยังมีเว็บไซต์จำนวนมากที่สร้างบน PHP stack ที่ดูแลอย่างดี
ฉันใช้ PHP ในโปรดักชันช่วงปี 2021~2023 และปัญหาไม่ได้อยู่ที่ตัวภาษา แต่คือ โค้ดเบสเก่า กับ ระดับเงินเดือนที่ต่ำ
มีโค้ดมรดกจากยุค PHP 4 เยอะมาก และรูปแบบการเข้าถึงข้อมูลก็แตกต่างกันไปหมด ทำให้ดูแลรักษายาก
แต่พอย้ายมา PHP 8 คุณภาพของโค้ดก็ดีขึ้นอย่างมาก
ถ้าจะเริ่มโปรเจ็กต์ใหม่ฉันอาจไม่เลือก PHP แต่ถ้าเป็น โปรเจ็กต์ Laravel สมัยใหม่ ฉันก็ยินดีเข้าร่วม
แต่เพราะมือใหม่เข้าถึงได้ง่ายโดยไม่มีความเข้าใจด้านความปลอดภัย จึงมีปัญหาอย่าง SQL injection เยอะ และนั่นทำให้มันได้ชื่อว่าเป็น ‘ภาษาที่ไม่ปลอดภัย’
ถ้าใช้กับเฟรมเวิร์กอย่าง Laravel ก็เป็น สภาพแวดล้อมที่เสถียรและสุกงอมกว่า มาก
เหมือนเล่นกีตาร์หรือเขียนบทกวี ใคร ๆ ก็ทำได้ แต่จะทำให้ดีนั้นยาก
สามารถเรียนรู้ได้จากการดูโค้ดด้วยตัวเอง และก็สนุกกับการ โฮสต์เซิร์ฟเวอร์วิทยุ/เพลงเอง
PHP ยิ่งอัปเดตก็ยิ่งกลายเป็น ภาษาที่ซับซ้อนขึ้น
มันยังเป็นภาษาที่เน้นเว็บเป็นหลัก เลยสงสัยว่าทำไมถึงพัฒนาไปได้ไกลขนาดนี้
สุดท้ายแล้ว ภาษาเชิงวัตถุแบบดั้งเดิมก็ดูจะลู่เข้าหากันในทิศทางคล้าย ๆ กัน
ถึงจะเป็นภาษาสำหรับเว็บเป็นหลัก ก็ยังมีเหตุผลมากพอที่จะพัฒนาต่อ การปรับปรุง ประสบการณ์นักพัฒนา มีคุณค่าเสมอ
array_first(), array_last() มีประโยชน์ แต่ ตัวดำเนินการ pipe อาจทำลายความสามารถในการดูแลรักษาได้
เพราะรองรับแค่ฟังก์ชันแบบ unary จึงอาจกลับกลายเป็นก่อบั๊กในฟังก์ชันที่ซับซ้อนกว่า
จุดที่น่าสนใจที่สุดในประกาศ PHP 8.5 คือ ความเสถียรและความเป็นผู้ใหญ่ของภาษา
น่าทึ่งที่ PHP เพิ่ม array_first, array_last, fatal error stack trace ได้ก่อน GTA6 เสียอีก
การเพิ่มฟังก์ชันและไวยากรณ์ใหม่ ๆ เข้ามาใน PHP อย่างต่อเนื่อง จะทำให้ ต้นทุนการบำรุงรักษา สูงขึ้นในระยะยาว
ถ้าดู release note อย่างเป็นทางการ จะเห็นว่าบางฟีเจอร์คุณค่าค่อนข้างก้ำกึ่ง
parse_url()ที่มีอยู่แล้วrelease note ของ PHP 8.5 อย่างเป็นทางการ
ตัวอย่างของตัวดำเนินการ pipe ในหลายภาษา จริง ๆ คือการละการใช้ ตัวแปรชั่วคราว แบบทั่วไปออกไป
ตัวอย่างการ parse URL ก็ไม่ได้เทียบกับ
parse_url()โดยตรงparse_url()ไม่ได้ทำตามมาตรฐานอย่างสมบูรณ์ และจัดการ relative URL ได้ไม่ดีฟังก์ชัน
uri()ใหม่ดูสะอาดกว่า และถ้ามีฟีเจอร์ partial function application เพิ่มเข้ามา chain แบบ pipe ก็น่าจะอ่านง่ายขึ้นใน PHP CLI ฉันเคยใช้ **backtick(
)** เพื่อเรียกshell_exec()เป็นประจำ แต่ตอนนี้ deprecated แล้ว มักจะเขียนแบบmkdir $dirname` อยู่บ่อย ๆเพราะมีความเสี่ยงจากการฉีด shell metacharacter จึงควรใช้
mkdir()หรือpcntl_exec()ของ PHP แทน