มีอะไรใหม่ใน PHP 8: สิ่งที่คุณต้องรู้!
เผยแพร่แล้ว: 2021-01-06เราจะติดต่อกับ PHP8 ใน วันที่ 26 พฤศจิกายน 2020 และแน่นอนว่ามีการเขียนจำนวนมากเกี่ยวกับคุณสมบัติที่กำลังจะมีขึ้นในการเปิดตัวที่น่าชื่นชมนี้
เนื่องจากเป็นเวอร์ชันหลัก จะมีการเปลี่ยนแปลงและคุณลักษณะใหม่ๆ รวมถึงการทำให้สิ่งสำคัญคือต้องตระหนักถึงสิ่งที่กำลังเปลี่ยนแปลงทั้งหมด จะช่วยให้คิดได้สะดวกขึ้นว่า 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 ไฟล์ของคุณจะปรากฏเช่นนี้ในระบบของฉัน
- zend_extension=opcache.so
- opcache.enable_cli=1
- ; การกำหนดค่าสำหรับโมดูล php opcache
- opcache.jit_buffer_size=256M
นอกจากนี้ ให้ใช้ฟังก์ชัน opcache_get_status() เพื่อให้แน่ใจว่ามีการใช้งานอยู่หรือไม่ มองข้ามส่วน 'จิต' ของอาร์เรย์นี้และรับข้อมูลเกี่ยวกับสถานะปัจจุบันของ JIT
var_dump(opcache_get_status()['jit']);
หากเปิดใช้งาน JIT อย่างสมบูรณ์แล้ว ควรพิมพ์ออกมาตามที่แสดงด้านล่าง
- อาร์เรย์ (7) {
- ["เปิดใช้งาน"]=>
- บูล(จริง)
- [“เปิด”]=>
- บูล(จริง)
- ["ใจดี"]=>
- อินท์(5)
- [“opt_level”]=>
- int(4)
- [“opt_flags”]=>
- อินท์(6)
- [“บัฟเฟอร์_ขนาด”]=>
- อินท์(268435440)
- [“buffer_free”]=>
- อินท์(268432880)
- }
แล้วมันเร็วกว่าไหม? พูดได้คำเดียวว่าเราอุทานอย่างอบอุ่นว่า "ใช่"
เราสังเกตเห็นว่ามีคนไม่กี่คนที่ทำการวัดประสิทธิภาพโดยใช้ชุด 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 ของคุณ แอปพลิเคชันทำงานได้อย่างสมบูรณ์ก่อนที่จะพูดว่า "ใช่" ในการอัปเกรด