2 คะแนน โดย GN⁺ 2025-11-21 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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

การเปลี่ยนแปลงย่อยอื่น ๆ

  • รองรับ 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 ความคิดเห็น

 
GN⁺ 2025-11-21
ความคิดเห็นบน Hacker News
  • ฉันยังคงรัก PHP อยู่เสมอ
    เมื่อ 23 ปีก่อนฉันทำซอฟต์แวร์เข้ารหัสสำหรับ PHP และมันก็ยังใช้งานได้ดีอยู่จนถึงตอนนี้
    ตอนนี้ก็ยังทำจดหมายข่าวเกี่ยวกับ PHP อยู่ และชุมชนก็ยังแข็งแกร่งเหมือนเดิม
    ฉันใช้ทั้ง Python และ Node.js แต่ถ้าเป็นงานที่เร็วและเรียบง่าย สุดท้ายก็มักจะกลับมาที่ PHP
    แต่หลังจาก PHP 5 เป็นต้นมา ภาษานี้ก็ ซับซ้อนขึ้นมาก ซึ่งก็ดูเป็นดาบสองคม

    • ฉันคิดว่า PHP คือ ตัวอย่างชั้นดีของการเปลี่ยนผ่านครั้งใหญ่ที่ทำได้ถูกต้อง
      ในช่วงที่ Python เปลี่ยนจาก 2 ไป 3 นั้น PHP ก็พัฒนาจาก 5.2→5.3 และ 5.6→7.0
      ทั้ง namespace, การ autoload แบบ PSR0, และการปรับปรุง parser ทำให้ทั้งความเร็วและโครงสร้างดีขึ้นมาก
      ในแต่ละอัปเดตก็ค่อย ๆ ปรับปรุงโดยไม่ทำลายความเข้ากันได้ และยังมีคำเตือนกับ shim ให้สามารถประคองเวอร์ชันเก่าไว้ได้
      การยกเลิก PHP 6 เกิดจากการเปลี่ยนวิธีจัดการสตริง แต่สุดท้ายฉันมองว่าเป็นการตัดสินใจที่ฉลาด
      มันเป็นทั้งภาษาและโปรเจ็กต์ชุมชนที่ฉันเคารพ เพราะดูแลปากท้องฉันมานานมาก
    • หลายคนบอกว่า PHP ซับซ้อนขึ้น แต่ โค้ดเรียบง่าย ที่ฉันเขียนด้วย 5.3 ก็ยังทำงานได้สมบูรณ์บน PHP 8
      จะเขียนให้ซับซ้อนก็ได้ แต่ไม่จำเป็นต้องทำแบบนั้น
    • สงสัยว่าซอฟต์แวร์เข้ารหัสนั้นคือ Zend หรือเปล่า
      ช่วงกลางยุค 2000 ฉันเคยใช้เครื่องมือเกี่ยวกับ Zend และจำได้ว่าค่อนข้างจุกจิกทีเดียว
    • PHP 8 ถ้าเรียนอย่างถูกวิธีตั้งแต่แรก ก็เข้าใจได้ง่ายพอสมควร
      ถ้าเรียน PSR และคำนึงถึงเรื่องความปลอดภัยกับความสามารถต่าง ๆ มันก็กลายเป็น ภาษาที่เสถียรและทรงพลังขึ้นมาก
  • วิวัฒนาการหลัง PHP 5 น่าประทับใจ แต่ในขณะเดียวกันก็มีปัญหาเรื่อง ความซับซ้อนที่เพิ่มขึ้น ด้วย
    สำหรับคนที่เคยเรียนจากเวอร์ชันเก่า โค้ดเบสสมัยใหม่อาจดูแปลกและตามได้ยาก
    นี่เป็นจุดแข็งของชุมชน แต่ก็เป็นกำแพงสำหรับนักพัฒนาที่อยากกลับมาใช้อีกครั้ง

    • ฉันยังคิดว่า PHP ยุคใหม่เป็น ภาษาที่อ่านง่าย อยู่มาก
      ฉันใช้ C++ มา 10 ปี แต่ตอนนี้ PHP อ่านง่ายกว่าโค้ด C++ สมัยใหม่เยอะ
    • แค่เรียน PHP 8 ก็พอแล้ว ตอนนี้ PHP ดีกว่าเมื่อก่อนมาก
    • ทุกวันนี้ซอฟต์แวร์ส่วนใหญ่ก็เจอปัญหาคล้ายกัน
      เหมือนเป้าหมายเรื่องความเรียบง่ายหายไป แล้วมีแต่การเพิ่มฟีเจอร์เข้าไปเรื่อย ๆ
    • จริง ๆ แล้วการเปลี่ยนแปลงแบบนี้ก็เกิดกับภาษาอื่นเหมือนกัน
      โดยเฉพาะสายเว็บที่เปลี่ยนเร็วมาก ถ้าไม่ตามก็จะตามไม่ทัน
    • แม้ฉันจะทำงานเป็นผู้เชี่ยวชาญ Java ก็ยังต้องอธิบายฟีเจอร์ใหม่ให้เพื่อนร่วมงานอยู่บ่อย ๆ
      PHP เป็นภาษาที่คนเริ่มต้นใช้ทำเว็บไซต์แรกของตัวเองกันเยอะ เลยอาจรู้สึกถึงความเปลี่ยนแปลงได้ชัดกว่าภาษาอื่น
  • หลายคนมีแนวโน้มจะ รู้สึกอายกับ PHP แต่ฉันไม่เป็นแบบนั้น
    ฉันไม่ได้รู้ลึกเรื่องภาษา แต่รู้ว่ามีโปรเจ็กต์เจ๋ง ๆ มากมาย
    โปรเจ็กต์ PHP ที่ฉันชอบที่สุดช่วงนี้คือ BookStack ซึ่งฉันใช้เป็นวิกิสำหรับครอบครัว
    ทุกวันนี้ก็ยังมีเว็บไซต์จำนวนมากที่สร้างบน PHP stack ที่ดูแลอย่างดี

    • PHP ยุคใหม่เป็น ภาษาที่เร็วและยอดเยี่ยม
      ฉันใช้ PHP ในโปรดักชันช่วงปี 2021~2023 และปัญหาไม่ได้อยู่ที่ตัวภาษา แต่คือ โค้ดเบสเก่า กับ ระดับเงินเดือนที่ต่ำ
      มีโค้ดมรดกจากยุค PHP 4 เยอะมาก และรูปแบบการเข้าถึงข้อมูลก็แตกต่างกันไปหมด ทำให้ดูแลรักษายาก
      แต่พอย้ายมา PHP 8 คุณภาพของโค้ดก็ดีขึ้นอย่างมาก
      ถ้าจะเริ่มโปรเจ็กต์ใหม่ฉันอาจไม่เลือก PHP แต่ถ้าเป็น โปรเจ็กต์ Laravel สมัยใหม่ ฉันก็ยินดีเข้าร่วม
    • PHP เป็น ภาษาที่ใช้งานได้ตรงไปตรงมาและสนุก
      แต่เพราะมือใหม่เข้าถึงได้ง่ายโดยไม่มีความเข้าใจด้านความปลอดภัย จึงมีปัญหาอย่าง SQL injection เยอะ และนั่นทำให้มันได้ชื่อว่าเป็น ‘ภาษาที่ไม่ปลอดภัย’
    • ฉันชอบ PHP backend มากกว่า JS/TS + เฟรมเวิร์กสมัยใหม่
      ถ้าใช้กับเฟรมเวิร์กอย่าง Laravel ก็เป็น สภาพแวดล้อมที่เสถียรและสุกงอมกว่า มาก
    • ฉันสร้างอาชีพมาจาก PHP และตอนนี้ก็ยังสนุกกับ กระบวนการทำให้มันทันสมัยขึ้น
      เหมือนเล่นกีตาร์หรือเขียนบทกวี ใคร ๆ ก็ทำได้ แต่จะทำให้ดีนั้นยาก
    • ฉันชอบ AzuraCast
      สามารถเรียนรู้ได้จากการดูโค้ดด้วยตัวเอง และก็สนุกกับการ โฮสต์เซิร์ฟเวอร์วิทยุ/เพลงเอง
  • PHP ยิ่งอัปเดตก็ยิ่งกลายเป็น ภาษาที่ซับซ้อนขึ้น
    มันยังเป็นภาษาที่เน้นเว็บเป็นหลัก เลยสงสัยว่าทำไมถึงพัฒนาไปได้ไกลขนาดนี้

    • ทั้ง C# และ Java ก็เน้นเว็บแบ็กเอนด์และซับซ้อนขึ้นเหมือนกัน
      สุดท้ายแล้ว ภาษาเชิงวัตถุแบบดั้งเดิมก็ดูจะลู่เข้าหากันในทิศทางคล้าย ๆ กัน
    • ตัวเว็บเองก็ไม่ได้เรียบง่ายอีกต่อไปแล้ว
    • ยังมีโปรเจ็กต์อย่าง NativePhp ด้วย
      ถึงจะเป็นภาษาสำหรับเว็บเป็นหลัก ก็ยังมีเหตุผลมากพอที่จะพัฒนาต่อ การปรับปรุง ประสบการณ์นักพัฒนา มีคุณค่าเสมอ
    • ตอนแรกฉันวิจารณ์โดยยังไม่ได้อ่านบทความ แต่พอกลับไปดูอีกที บางฟีเจอร์ก็น่าสนใจดี
      array_first(), array_last() มีประโยชน์ แต่ ตัวดำเนินการ pipe อาจทำลายความสามารถในการดูแลรักษาได้
      เพราะรองรับแค่ฟังก์ชันแบบ unary จึงอาจกลับกลายเป็นก่อบั๊กในฟังก์ชันที่ซับซ้อนกว่า
  • จุดที่น่าสนใจที่สุดในประกาศ PHP 8.5 คือ ความเสถียรและความเป็นผู้ใหญ่ของภาษา

  • น่าทึ่งที่ PHP เพิ่ม array_first, array_last, fatal error stack trace ได้ก่อน GTA6 เสียอีก

    • เป็นการเพิ่มที่ดี แต่จริง ๆ แล้วใช้ array_shift หรือ array_pop ก็พออยู่แล้ว
  • การเพิ่มฟังก์ชันและไวยากรณ์ใหม่ ๆ เข้ามาใน PHP อย่างต่อเนื่อง จะทำให้ ต้นทุนการบำรุงรักษา สูงขึ้นในระยะยาว
    ถ้าดู release note อย่างเป็นทางการ จะเห็นว่าบางฟีเจอร์คุณค่าค่อนข้างก้ำกึ่ง

    • ส่วนขยาย URI เร็วก็จริง แต่ซ้ำกับ parse_url() ที่มีอยู่แล้ว
    • ตัวดำเนินการ pipe เป็นเรื่องของรสนิยม และอาจทำให้สไตล์โค้ดไม่สม่ำเสมอ
    • การปรับปรุง clone เป็นการเปลี่ยนแปลงเล็กน้อยมาก
    • #Discard/void มาแทนความสามารถของ static analyzer
    • closure ในค่าคงที่น่าสนใจ แต่ก็อาจนำไปสู่คุณสมบัติที่ซับซ้อน (#attribute)
    • persistent cURL handles คือสิ่งที่ช่วยเพิ่มประสิทธิภาพจริง
    • array_first() ก็เป็นเพียง syntactic sugar และคงแทบไม่ถูกใช้ในโปรเจ็กต์ขนาดใหญ่
  • 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` อยู่บ่อย ๆ

    • นั่นเป็น anti-pattern ด้านความปลอดภัย
      เพราะมีความเสี่ยงจากการฉีด shell metacharacter จึงควรใช้ mkdir() หรือ pcntl_exec() ของ PHP แทน