มีอะไรใหม่ใน PHP 8: สิ่งที่คุณต้องรู้!

เผยแพร่แล้ว: 2021-01-06

เราจะติดต่อกับ PHP8 ใน วันที่ 26 พฤศจิกายน 2020 และแน่นอนว่ามีการเขียนจำนวนมากเกี่ยวกับคุณสมบัติที่กำลังจะมีขึ้นในการเปิดตัวที่น่าชื่นชมนี้

PHP 8

เนื่องจากเป็นเวอร์ชันหลัก จะมีการเปลี่ยนแปลงและคุณลักษณะใหม่ๆ รวมถึงการทำให้สิ่งสำคัญคือต้องตระหนักถึงสิ่งที่กำลังเปลี่ยนแปลงทั้งหมด จะช่วยให้คิดได้สะดวกขึ้นว่า PHP8 จะส่งผลต่อแอปของคุณอย่างไร และต้องดำเนินการอย่างไรเพื่อให้แน่ใจว่าคุณสามารถอัปเกรดได้อย่างสะดวกโดยไม่มีปัญหา

เราได้ทำการเปลี่ยนแปลงที่สำคัญที่สุดสองสามข้อเพื่อค้นหาว่าเราจะได้รับอะไรใน PHP รุ่นถัดไปและสิ่งที่ควรค่าแก่การวิพากษ์วิจารณ์

มาเริ่มกันที่ภาพรวมกันเลย!

ภาพรวม PHP 8

ดังที่กล่าวไว้ข้างต้น PHP 8 ได้แนะนำชุดคุณสมบัติใหม่ การปรับปรุง ฟังก์ชัน และการเลิกใช้งานภาษา คุณลักษณะที่กล่าวถึงมากที่สุดคือคอมไพเลอร์ JIT อย่างไรก็ตาม คุณลักษณะที่ปรับปรุงประสิทธิภาพ เช่น JIT สมควรได้รับความสนใจ แต่การปรับปรุงทางวากยสัมพันธ์คาดว่าจะมีผลดียิ่งขึ้นสำหรับผู้ปฏิบัติงาน PHP "อย่างน้อยก็ในระยะสั้น"

ประวัติความเปลี่ยนแปลง

มีการเสนอการเปลี่ยนแปลง PHP สองสามข้อ อภิปราย นำไปใช้ และอนุมัติเพิ่มเติมในลำดับสั้นๆ เป็นที่นิยม ไม่มีข้อโต้แย้ง และมีวิธีการที่เป็นธรรมชาติในการนำไปใช้

และหลังจากนั้นก็เป็นคนที่ถูกลอง ล้มเหลว และกลับมาหลายครั้งก่อนที่เราจะยอมรับในที่สุด สองสามครั้ง การใช้งานใช้เวลานานในการแยกแยะ และบางครั้งความคิดเองก็เพิ่งเกิดขึ้น และบางครั้งชุมชนเองก็ยังไม่ได้อุ่นเครื่องกับแนวคิดนี้—”ยังไม่ถึงเวลา”

เครดิตตกอยู่ในหมวดหมู่ประเภท พวกเขาได้รับการ เสนอครั้งแรกในปี 2559 สำหรับ PHP 7.1 อย่างไรก็ตาม พวกเขาพบกับการต่อต้านอย่างดื้อรั้นและแพ้คะแนนการยอมรับอย่างมาก ตอนนี้ กรอไปข้างหน้าอย่างรวดเร็วสี่ปี และค่อนข้างคล้ายกันหากข้อเสนอขอบเขตที่ลดลงเล็กน้อยผ่านผู้คัดค้านเพียงคนเดียว เห็นได้ชัดว่าเป็นความคิดที่ถึงเวลาอย่างแน่นอน!

รหัสเก่ามีปัญหาอย่างไร

เนื่องจาก PHP 8 เป็นเวอร์ชันใหม่ขนาดใหญ่ เราควรคาดหวังว่าโค้ดเก่าจะเข้ากันไม่ได้อีก อย่างไรก็ตาม การเปลี่ยนแปลงส่วนใหญ่ที่อาจเสนอให้เกิดอาการแทรกซ้อนได้ถูกถ่ายทอดไปแล้ว ใน เวอร์ชัน 7.2 7.3 และ 7.4 มาพูดถึงการเปลี่ยนแปลงล่าสุดกันเถอะ พวกเขาคือ:

ตำนานคำพูดวิเศษ

  • ประเภทที่ แท้จริง
  • FILTER_SANITIZE_MAGIC_QUOTES ตัวกรอง
  • ยกเลิกการผูก $this จากการปิดแบบไม่คงที่
  • array_key_exists() กับอ็อบเจกต์
  • mb_strrpos() พร้อมการเข้ารหัสเป็นอาร์กิวเมนต์ที่ 3
  • การสะท้อน การส่งออก () วิธีการ
  • Convert_cyr_string() ฟังก์ชั่น
  • implode() พารามิเตอร์คำสั่งผสม
  • ฟังก์ชัน restore_include_path()
  • ฟังก์ชัน hebrevc()
  • money_format() ฟังก์ชัน
  • allow_url_include ini directive
  • ezmlm_hash() ฟังก์ชั่น

ฟังก์ชันใหม่ใน PHP 8

str_contains

หากสตริงหนึ่งมีอีกสตริงหนึ่ง แสดงว่ามีหลายวิธีในการค้นหา

โดยทั่วไป คุณจะใช้ strpos() อย่างที่คุณทราบ strpos() ใช้กองหญ้าข้างเข็มที่คุณต้องการค้นหา ส่งกลับจำนวนเต็มที่แสดงตำแหน่งแรกที่คุณเห็นเข็ม

ตอนนี้ เมื่อมันส่งคืนตำแหน่งของสตริงในอีกสตริงหนึ่ง คุณจึงไม่สามารถตรวจสอบว่า strpos() ค้นพบหรือไม่ ถ้ามันส่งคืน “0” (ตำแหน่งจะถูกจัดทำดัชนีเป็นศูนย์และเริ่มต้นด้วย 0 แทนที่จะเป็น 1) เงื่อนไขจะถือว่าเป็นค่าเท็จและระบุว่าไม่พบ

นั่นหมายความว่าอย่างไร?

คุณจะต้องเขียนเงื่อนไข –“strpos($haystack, $needle) !== false” เท็จแสดงว่าไม่พบตำแหน่งของสตริง นี่เป็นวิธีการที่ไม่โปร่งใสและลึกลับในการค้นหาสตริงในสตริง! ดีไม่สับสน

เพื่อหลีกเลี่ยงปัญหานี้ PHP 8 จะนำ str_contains() งานของ str_contains() คือการส่งคืนบูลีนอย่างง่ายที่แสดงว่ามีเข็มอยู่ในกองหญ้าหรือไม่ มันง่ายกว่ามากที่จะเขียน นอกจากนั้น เข้าใจในฐานะคนที่คอยดูแลโค้ดใช่ไหม

 if (str_contains( 'Foo Bar Baz' , 'Foo' )) { // FOUND }

PHP 8: คุณสมบัติและการเปลี่ยนแปลงของเครื่องยนต์

มีฟีเจอร์เอ็นจิ้นใหม่บางอย่าง และการเปลี่ยนแปลงที่สังเกตเห็นใน PHP 8 คุณสมบัติ headlining คือคอมไพเลอร์ JIT ตัวใหม่อย่างไม่ต้องสงสัย

JIT คอมไพเลอร์

  • การบังคับใช้ LSP
  • ข้อผิดพลาดร้ายแรงในลายเซ็นวิธีการที่เข้ากันไม่ได้
  • ทรัพยากร "ชั้นเรียน"
  • XML-RPC อยู่ใน PECL . แล้ว
  • พฤติกรรมยืนยัน
  • การเปลี่ยนแปลงการสะท้อน

เพื่อจุดประสงค์หลักของบล็อกนี้ เราจะเน้นที่คอมไพเลอร์ JIT ทรัพยากร "คลาส" และสุดท้าย สะท้อนการเปลี่ยนแปลง API

คอมไพเลอร์แบบทันเวลา ( RFC )

เนื่องจากการปรับปรุงความเร็วที่เกิดขึ้นก่อนการเปิดตัวของ PHP7 คอมไพเลอร์ Just-In-Time (หรือ JIT) จึงเกิดขึ้น ได้รับการแนะนำให้รู้จักกับ PHP8 เนื่องจากแทบไม่มีการปรับปรุงความเร็วที่สามารถทำได้โดยไม่ต้องใช้ JIT แนวคิดก็คือจะปรับปรุงประสิทธิภาพของ PHP

โค้ด PHP จะถูกแปลเป็น bytecodes เมื่อดำเนินการ และ bytecodes เหล่านั้นจะถูกนำมาใช้เพิ่มเติมเพื่อดำเนินการตามขั้นตอนในโปรแกรม

PHP จะวิเคราะห์โค้ดที่คุณรัน นั่นคือความหมายของ JIT นอกจากนี้ยังสามารถตัดสินใจในเวลาจริงนอกเหนือจากการปรับปรุงประสิทธิภาพของโค้ดในขณะที่คุณดำเนินการ มันจะมีประโยชน์อย่างมากในแอพพลิเคชั่นที่ต้องใช้ CPU มาก และไม่ใช่เฉพาะในขณะที่ใช้ในสถานการณ์บนเว็บเท่านั้น

นั่นสะท้อนถึงแอพพลิเคชั่น PHP ฝั่งเซิร์ฟเวอร์ที่แพร่หลายมากขึ้นอย่างแน่นอนด้วยระบบ PHP inbuilt JIT

คุณต้องเปิดใช้งาน JIT ก่อนหากต้องการใช้งาน ในระบบทดสอบของเรา (Ubuntu 20.04) เราได้ติดตั้งโมดูล PHP opcache แล้ว ซึ่งเราติดตั้งด้วยแพ็คเกจ PHP8 หลัก เราได้กำหนดค่าในไฟล์ที่วางอยู่ที่ /etc/php/8.0/cli/conf.d/10-opcache.ini

ตอนนี้คุณพร้อมที่จะเปิดใช้งาน JIT แล้วใช่ไหม  

  • เปิดใช้งาน opcache

คุณสามารถกำหนดที่เก็บข้อมูลหน่วยความจำให้กับการตั้งค่า opcache.jit_buffer_size ไฟล์ของคุณจะปรากฏเช่นนี้ในระบบของฉัน

  1. zend_extension=opcache.so
  2. opcache.enable_cli=1
  3. ; การกำหนดค่าสำหรับโมดูล php opcache
  4. opcache.jit_buffer_size=256M

นอกจากนี้ ให้ใช้ฟังก์ชัน opcache_get_status() เพื่อให้แน่ใจว่ามีการใช้งานอยู่หรือไม่ มองข้ามส่วน 'จิต' ของอาร์เรย์นี้และรับข้อมูลเกี่ยวกับสถานะปัจจุบันของ JIT


var_dump(opcache_get_status()['jit']);

หากเปิดใช้งาน JIT อย่างสมบูรณ์แล้ว ควรพิมพ์ออกมาตามที่แสดงด้านล่าง

  1. อาร์เรย์ (7) {
  2. ["เปิดใช้งาน"]=>
  3. บูล(จริง)
  4. [“เปิด”]=>
  5. บูล(จริง)
  6. ["ใจดี"]=>
  7. อินท์(5)
  8. [“opt_level”]=>
  9. int(4)
  10. [“opt_flags”]=>
  11. อินท์(6)
  12. [“บัฟเฟอร์_ขนาด”]=>
  13. อินท์(268435440)
  14. [“buffer_free”]=>
  15. อินท์(268432880)
  16. }

แล้วมันเร็วกว่าไหม? พูดได้คำเดียวว่าเราอุทานอย่างอบอุ่นว่า "ใช่"

เราสังเกตเห็นว่ามีคนไม่กี่คนที่ทำการวัดประสิทธิภาพโดยใช้ชุด mandelbrot ดังนั้นเราจึงตัดสินใจใช้ไลบรารี่ที่เราสร้างขึ้นเมื่อสักครู่นี้เพื่อดึงเศษส่วนต่างๆ ใน ​​PHP ทั้งหมดที่เราทำคือสร้างเศษส่วนสามส่วนและติดตามว่าใช้เวลานานเท่าใดในการใช้ฟังก์ชัน microtome() เราได้แสดงผลลัพธ์สำหรับ PHP 7.4.8 ด้านล่าง

  • การเผาไหม้ – 84.2269203186
  • แมนเดิลบรอต – 21.552599906921
  • ไทรคอร์น – 32.685042858124

เมื่อเรารันโค้ดเดียวกันบน PHP8 มัน ค่อนข้าง เร็วกว่า ตัวเลขจะพูดเพื่อตัวเอง .

  • การเผาไหม้ – 15.27227716776
  • แมนเดิลบรอต -3.7528541088104
  • ไทรคอร์น -4.4957919120789

การเพิ่มความเร็วครั้งใหญ่นี้ค่อนข้างน่าสนใจ รหัสที่เราใช้ที่นี่สร้างเศษส่วนขนาดใหญ่ แต่เราจำได้เมื่อสร้างรหัสที่ใช้เวลาส่วนใหญ่ของเราในการรอการสร้างเศษส่วน

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

เราไม่ได้ดูที่การเพิ่มความเร็วสำหรับแอปอย่าง WordPress หรือ Drupal แต่จากที่เราอ่านมา แอปพลิเคชันประเภทนี้มีความแตกต่างกันเล็กน้อย ในอนาคต เราจะใช้การวัดประสิทธิภาพบนแพลตฟอร์มเหล่านี้เพื่อค้นหาความแตกต่างที่ JIT ทำเครื่องหมายที่นั่น

ประเภทสหภาพแรงงาน ( RFC )

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

ใน PHP8 ตอนนี้สามารถกำหนดอาร์กิวเมนต์และคืนค่าได้หลากหลายประเภท โดยแยกตามอักขระไปป์

เราได้แสดงฟังก์ชันที่สามารถรับค่าทศนิยมหรือจำนวนเต็มได้ด้านล่าง

 function addNumbers(int|float $number1, int|float $number2) : int|float { return $number1 + $number2; }

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

เราแค่เรียกมันว่าเหมือนคนอื่น ๆ เพื่อใช้ฟังก์ชั่นด้านบน

 echo addNumbers(1, 1); // prints 2 echo addNumbers(1.1, 1.1); // prints 2.2

ในกรณีที่เราพยายามส่งสตริงไปยังฟังก์ชันที่เหมือนกัน:

 echo addNumbers('one', 'two');

เราจะได้รับข้อผิดพลาดร้ายแรงของ PHP ที่ร้องว่าเราต้องส่ง float หรือ "int" เข้าไปในฟังก์ชัน

คุณไม่สามารถใช้ประเภทโมฆะเป็นประเภทยูเนี่ยนได้เนื่องจากกำหนดว่าฟังก์ชันจะไม่ส่งคืนสิ่งใด พูดง่ายๆ ก็คือ คุณไม่สามารถอุทานออกมาได้ว่าฟังก์ชันจะส่งกลับค่าเป็นโมฆะหรือจำนวนเต็ม คุณจะได้รับข้อผิดพลาดร้ายแรงของ PHP

แม้ว่าการเปลี่ยนแปลงตามปกติจะเห็นว่ามีการใช้คุณลักษณะนี้เพียงเล็กน้อย เนื่องจากก่อนหน้านี้ทำได้เพียงกำหนดมูลค่าประเภทต่างๆ ในความคิดเห็นเท่านั้น ส่งผลให้ความคิดเห็นที่บล็อก doc มีรายละเอียดมากกว่าโค้ด

ตัวดำเนินการ Nullsafe (RFC)

นอกจากตัวดำเนินการการรวมค่า null แล้ว ความสามารถในการตรวจจับค่าส่งคืนที่เป็นค่าว่างยังสามารถทำได้โดยตรงจากเมธอด หากคุณไม่รู้ตัว ตัวดำเนินการการรวมค่า null จะช่วยให้คุณได้รับค่า และคุณไม่จำเป็นต้องทดสอบในกรณีที่มีค่าอยู่นอกเหนือจากการคืนค่าอื่นในกรณีที่ค่าแรกเป็นค่าว่าง

ดังนั้นเราจึงสามารถทำสิ่งนี้เพื่อรับค่าจาก – “$_GET superglobal” และในกรณีที่ไม่มีค่านั้น ให้ใส่ "0"


1. $page = $_GET['page'] ?? 0;

2. echo $page;

การทำงานของโอเปอเรเตอร์ null safe นั้นเหมือนกัน แต่ให้คุณสร้างช็อตคัทที่มีประโยชน์และทดสอบการคืนค่า null จากวิธีใดวิธีหนึ่งก่อนที่จะพยายามใช้ค่านั้น

เราสังเกตเห็นว่าสิ่งนี้จะเป็นประโยชน์อย่างยิ่งใน Drupal ซึ่งเรามักจะเขียนโค้ดตรวจสอบจำนวนมากเพื่อให้แน่ใจว่า "ผลตอบแทนจากเมธอด" หรือ "คุณสมบัติของออบเจ็กต์" มีสิ่งต่างๆ อยู่ในนั้นก่อนที่จะใช้งาน นี่เป็นภาคบังคับเนื่องจากสถานะตามบริบทของวัตถุใน Drupal เนื่องจากเนื้อหาที่มีอยู่ การเปลี่ยนแปลงนี้จะทำให้การตรวจสอบบางอย่างง่ายขึ้นอย่างแน่นอน

อาร์กิวเมนต์ที่มีชื่อ ( RFC )

อาร์กิวเมนต์ที่มีชื่ออนุญาตให้คุณกำหนดลำดับอาร์กิวเมนต์ที่แตกต่างกันและฟังก์ชันการเรียก ใช้ฟังก์ชันปกติต่อไปนี้ซึ่งมีสองพารามิเตอร์ มันเติมอาร์เรย์ตามความยาวที่กำหนด

 function fillArray(array $arrayToFill, int $number) : array { for ($i = 0 $i < $number; ++$i) { $arrayToFill[$i] =1; } return $arrayToFill; }

เราสามารถส่งต่ออาร์กิวเมนต์ในการจัดเรียงที่พวกเขากำหนดไว้ สามารถเรียกเทคนิคนี้ในลักษณะปกติ

 $newArray = fillArray([], 2);

สำหรับ PHP8 คุณสามารถตั้งชื่อพารามิเตอร์เมื่อคุณส่งต่อไปยังฟังก์ชันได้ นอกจากนี้ยังช่วยให้คุณสามารถส่งพารามิเตอร์ในลำดับใดก็ได้ที่เราต้องการ

 $newArray = fillArray(number: 2, arrayToFill: []);

ตัวอย่างทั่วไป แต่สามารถทำให้โค้ดอ่านง่ายขึ้นได้เช่นกัน

เทคนิคนี้ใช้ได้กับฟังก์ชันทั้งหมดใน PHP ไม่ใช่แค่ฟังก์ชันที่กำหนดโดยผู้ใช้ ในภาษา PHP ฟังก์ชันอาร์เรย์และสตริงมีลำดับพารามิเตอร์ที่ไม่เท่ากัน ดังนั้นจึงเป็นส่วนเสริมที่น่ายินดีอย่างแท้จริง

แอตทริบิวต์ V2 ( RFC1 RFC2 RFC3 )

คุณลักษณะจัดเตรียมกลไกเพื่อเชื่อมข้อมูลเมตากับคลาส PHP ฟังก์ชัน คุณสมบัติคลาส พารามิเตอร์ฟังก์ชัน และค่าคงที่ ไม่สามารถเข้าถึงได้โดยตรงผ่านโค้ด และคุณต้องดึงมันออกมาด้วยความช่วยเหลือของ PHP ที่สร้างขึ้นในคลาสการสะท้อน

คลาส ReflectionClass อยู่ใน PHP ตั้งแต่ PHP5; อย่างไรก็ตาม getAttribute() วิธีการใหม่สำหรับ PHP8 เมธอดนี้ส่งคืนช่วงของออบเจ็กต์ ReflectionAttribute ที่จะรับข้อมูลเกี่ยวกับแอตทริบิวต์

การเพิ่มนี้ต้องเผชิญกับการเปลี่ยนแปลงเล็กน้อย (ดังที่เราสังเกตได้จาก RFC หลายรายการด้านบน) ในกรณีที่คุณยกตัวอย่างคลาส คุณสามารถใช้ ReflectionClass และพิมพ์ข้อมูลแอตทริบิวต์ที่มีอยู่ในระดับคลาสได้ มีคุณสมบัติค่อนข้างมากใน PHP8 ดังนั้นเราขอแนะนำให้อ่าน RFCs และทำความคุ้นเคยกับสิ่งที่เป็นจริงและวิธีที่คุณสามารถรวมเข้ากับโค้ดของคุณ

นิพจน์การจับคู่ ( RFC )

ใน PHP 8 เราสามารถเปรียบเทียบนิพจน์การจับคู่ใหม่กับคำสั่งสวิตช์ชวเลข

ดูเหมือนเป็นการประกาศฟังก์ชันที่จะคืนค่าโดยพิจารณาจากค่าที่ส่งเข้ามา

คำสั่ง switch ใน PHP นั้นยอดเยี่ยมมากเมื่อคุณต้องการตรวจสอบเงื่อนไขในนิพจน์ที่เหมือนกันโดยไม่ต้องรวมคำสั่ง if หลายตัวพร้อมกัน

ที่นี่เรานำการเปรียบเทียบ แบบ if-else พื้นฐานเกี่ยวกับนิพจน์ที่เหมือนกัน

 <?php if ($i == 'apple') { echo 'i is apple'; } elseif ($i == 'cake') { echo 'i is cake'; } else { echo 'i is pizza'; }

และนี่คือลักษณะที่คำสั่ง switch เทียบเท่าของตัวอย่างก่อนหน้าของเราจะปรากฏเช่น

 <?php switch ($i) { case 'apple': echo 'i is apple'; break; case 'cake': echo 'i is cake'; break; default: echo 'i is pizza'; }

ทรัพยากร "ชั้นเรียน"

"คลาส" ของทรัพยากรมาในรายการการเปลี่ยนแปลงที่สำคัญใน PHP 8 และทำหน้าที่เป็นการแทนที่แบบไม่ทันทีสำหรับประเภททรัพยากรที่กำหนด ดูด้านล่างเพื่อทราบรายการทดแทนที่มีให้ ได้แก่:

  • CurlHandle — curl_init() ตอนนี้ส่งคืน CurlHandle ซึ่งเกี่ยวข้องกับทรัพยากร curl
  • Socket / AddressInfo - กำหนดโดยส่วนขยายซ็อกเก็ต ปริมาณของฟังก์ชัน socket_*() จะคืนค่าซ็อกเก็ต ในขณะที่ฟังก์ชัน socket_address_info_lookup() จะคืนค่าอินสแตนซ์ AddressInfo
  • GdImage — แสดงถึงทรัพยากร GD ซึ่งกู้คืนโดยฟังก์ชัน imagecreatefrom*() จำนวนมาก

นอกจากนี้ สิ่งสำคัญคือต้องทราบว่าทรัพยากรไม่ได้ถูกทำลายโดยฟังก์ชันต่างๆ เช่น curl_close() แต่คุณต้อง unset() อินสแตนซ์เพื่อยกเลิกการอ้างอิงเนื่องจากตอนนี้เป็นอินสแตนซ์ของคลาส
คุณได้รับความสามารถในการระบุคลาสเป็นคำใบ้ในฟังก์ชันและเมธอดของคุณ
ก่อนหน้านี้ เราต้องส่งคืนค่าที่ไม่ได้พิมพ์หรือปล่อยให้อาร์กิวเมนต์ทรัพยากรและจัดทำเอกสารผ่านคำอธิบายประกอบ แต่ตอนนี้ คุณสามารถมีประเภทที่ชัดเจนได้ และนั่นไม่เพียงทำให้โค้ดของคุณอ่านง่ายขึ้น แต่ยังปลอดภัยสำหรับการพิมพ์อีกด้วย
อะไรคือการแลกเปลี่ยนที่นี่?
ตอนนี้คุณจะต้องอัปเดตโค้ดของคุณ หากคุณต้องการทำลายทรัพยากรด้วยความช่วยเหลือของ unset() แทนฟังก์ชันก่อนหน้านี้ที่ใช้ในการทำลายทรัพยากร โดยปกติสามารถทำได้ผ่านการค้นหาและแทนที่

การเปลี่ยนแปลง API ของ Reflection

อีกอันเล็กน้อย แต่การเปลี่ยนแปลงที่สำคัญใน PHP 8 นั้นเกี่ยวข้องกับ Reflection API ขณะใช้ระบบแอตทริบิวต์ คุณสามารถดึงข้อมูลแอตทริบิวต์เหล่านั้นผ่าน Reflection API ได้อย่างสะดวกในคลาสการสะท้อนใดๆ
ด้วยการเพิ่มประเภทแบบผสมและแบบรวมกัน ทำให้เทคนิค ReflectionParameter getClass(), isCallable() และ isArray() เลิกใช้แล้ว
สถานการณ์เป็นเช่นนั้นเพราะการใช้ getType() ดีกว่ามาก และคุณจะได้รับรายการประเภททั้งหมดที่พารามิเตอร์เฉพาะตรงตามที่

การปรับปรุงไวยากรณ์ PHP 8

ตามที่เราสังเกตเห็น JIT กำลังขโมยพาดหัวข่าว การปรับปรุงไวยากรณ์ PHP 8 มอบข้อได้เปรียบด้านคุณภาพชีวิตอย่างมากสำหรับนักพัฒนา PHP
ไม่ว่าจะเป็นการกำจัดต้นแบบทั่วไประหว่างอาร์กิวเมนต์คอนสตรัคเตอร์ที่ได้รับการส่งเสริมหรือการจัดการข้อยกเว้นและข้อผิดพลาดที่ได้รับการปรับปรุง นักพัฒนารู้สึกตื่นเต้นมากมาย

  • “ผสม” ชนิดเทียม
  • ประเภทสหภาพ
  • โปรโมชั่นคุณสมบัติของตัวสร้างคลาส
  • โยนข้อยกเว้นจากนิพจน์
  • คุณลักษณะ
  • ::คลาสที่แพร่หลาย
  • จับตามประเภทเท่านั้น
  • จับคู่นิพจน์

เพื่อรักษาจุดประสงค์ของบล็อกนี้ เรากำลังมุ่งเน้นไปที่ประเภทสหภาพ คุณลักษณะ และนิพจน์การจับคู่

ประเภทสหภาพ

ประเภทสหภาพแสดงว่าค่าเป็นหนึ่งในสองประเภทหรือมากกว่าที่ระบุ ทำด้วยแถบแนวตั้งที่วางอยู่ระหว่างทุกประเภทที่อนุญาต สำหรับนักพัฒนาหลายคนที่เข้าใจคำอธิบายประกอบ PHP อย่างลึกซึ้งเพื่อคืนค่าหรือระบุพารามิเตอร์ของคุณ แสดงว่าคุณได้ทำสิ่งนี้ไปแล้ว เป็นไปได้มากที่สุด
ประเภทของสหภาพสามารถสร้างความซับซ้อนและความยากลำบากในการทำความเข้าใจสำหรับผู้ที่ยอมรับประเภทต่าง ๆ จำนวนมากหรือส่งคืนประเภทต่าง ๆ จำนวนมาก
อย่างไรก็ตาม สิ่งนี้จะมีประโยชน์มากในหลายๆ ครั้ง ตัวอย่างเช่น ในกรณีที่คุณสามารถยอมรับหรืออ็อบเจ็กต์ที่ใช้อินเทอร์เฟซแบบสตริงได้ใหม่ (“สตริง|สตริงได้”) หรือสตริง หรือหากคุณยอมรับออบเจ็กต์ที่ใช้อินเทอร์เฟซแบบ Traversable (“อาร์เรย์|ทราเวอร์ได้”) หรืออาร์เรย์ .

จับคู่นิพจน์

นิพจน์การจับคู่จะตัดการคาดเดาที่เกี่ยวข้องกับการค้นหาว่าความล้มเหลวในการทำลายภายในกรณีสวิตช์ที่กำหนดนั้นเป็นไปโดยเจตนาหรือไม่ นอกจากนี้ยังช่วยลดความซับซ้อนของรูปแบบปกติของการกำหนดค่าตามการจับคู่
เมื่อใช้ ค่าที่เราส่งไปยัง match() จะถูกเปรียบเทียบโดยตรงกับนิพจน์ทางด้านซ้ายมือ ไม่ว่าจะเป็นนิพจน์หรือค่า ค่าที่คุณส่งไปยัง match() ควรจับคู่เพื่อให้เลือกได้
เมื่อจับคู่แล้ว นิพจน์ที่อยู่ทางด้านขวาจะถูกประมาณการและคืนค่าที่ส่งคืน ในขณะที่นิพจน์สามารถเป็นฟังก์ชัน Lambda หรือ callables เท่านั้น และไม่อนุญาตให้ปิดหลายบรรทัด

คุณลักษณะ

PHP 8 รวมแอตทริบิวต์ที่ระดับภาษาด้วย แม้ว่าแอตทริบิวต์จะมีอยู่นานกว่า 15 ปีผ่านคำอธิบายประกอบ docblock แต่การสร้างแอตทริบิวต์ในภาษานั้นให้ประสิทธิภาพที่ดีขึ้นและแน่นอน มีพลังมากขึ้น และความสอดคล้องที่มากขึ้น เราน่าจะเห็นคุณลักษณะที่ใช้อย่างมากในการพัฒนาเครื่องมือและแอปพลิเคชันที่รวดเร็ว

บทสรุป

แน่นอนว่ามีการเปลี่ยนแปลงบางอย่างใน PHP8 ถึงกระนั้น ดูเหมือนว่าโค้ดที่เลิกใช้แล้วส่วนใหญ่จะถูกกำจัดออกไปสำหรับฟีเจอร์ที่เก่ากว่าซึ่งเราไม่ได้เห็นว่ามีการใช้ในครั้งล่าสุด
เราค่อนข้างสนใจที่จะสังเกตเห็นว่าเอ็นจิ้น JIT จะมีผลกระทบต่อโค้ดเบสที่เราใช้และในชุมชน PHP ที่กว้างขึ้น โดยบอกว่าเราขอแนะนำอย่างยิ่งให้สแกนฐานโค้ดของคุณเพื่อหาความไม่เข้ากันกับ PHP8 และรันการทดสอบหน่วยเพื่อให้แน่ใจว่า PHP ของคุณ แอปพลิเคชันทำงานได้อย่างสมบูรณ์ก่อนที่จะพูดว่า "ใช่" ในการอัปเกรด