การเปิดตัวภาษาโปรแกรม PHP 8.1

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

การปรับปรุงที่สำคัญใน PHP 8.1:

  • เพิ่มการสนับสนุนสำหรับการแจงนับ ตัวอย่างเช่น ตอนนี้คุณสามารถใช้โครงสร้างต่อไปนี้: enum Status { case Pending; กรณีใช้งานอยู่; กรณีเก็บถาวร; } คลาสโพสต์ { ฟังก์ชั่นสาธารณะ __construct (สถานะส่วนตัว $status = สถานะ::รอดำเนินการ; ) {} ฟังก์ชั่นสาธารณะ setStatus (สถานะ $สถานะ): เป็นโมฆะ { // … } } $post->setStatus(สถานะ::ใช้งานอยู่);
  • เพิ่มการรองรับเธรดน้ำหนักเบาที่เรียกว่า Fibers ซึ่งช่วยให้คุณจัดการเธรดการประมวลผลในระดับต่ำ มีการวางแผนที่จะเพิ่มการรองรับไฟเบอร์ในเฟรมเวิร์ก Amphp และ ReactPHP $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend('หลังจากระงับ'); // … }); $valueAfterSuspending = $fiber->เริ่มต้น(); $fiber->resume('หลังจากกลับมาทำงานต่อ');
  • การใช้งานแคชโค้ดออบเจ็กต์ (opcache) ได้รับการปรับปรุง ทำให้สามารถแคชข้อมูลเกี่ยวกับการสืบทอดคลาสได้ การเพิ่มประสิทธิภาพทำให้สามารถเพิ่มประสิทธิภาพของบางแอปพลิเคชันได้ 5-8% การเพิ่มประสิทธิภาพอื่น ๆ ได้แก่ การเพิ่มประสิทธิภาพการทำงานของ JIT การใช้การสนับสนุน JIT สำหรับสถาปัตยกรรม ARM64 (AArch64) การเร่งความเร็วในการจำแนกชื่อ การเพิ่มประสิทธิภาพของไลบรารี timelib และ ext/date การเพิ่มประสิทธิภาพการทำให้เป็นอนุกรมและการดีซีเรียลไลซ์ การเพิ่มประสิทธิภาพของ get_declared_classes() explode() , ฟังก์ชัน strtr(), strnatcmp(), dechex() โดยทั่วไป ประสิทธิภาพเพิ่มขึ้น 23.0% สำหรับ Symfony Demo และ 3.5% สำหรับ WordPress
  • ตัวดำเนินการคลายแพ็กภายในอาร์เรย์ "...$var" ซึ่งอนุญาตให้แทนที่อาร์เรย์ที่มีอยู่เมื่อกำหนดอาร์เรย์ใหม่ ได้รับการขยายให้รองรับคีย์สตริง (ก่อนหน้านี้รองรับเฉพาะตัวระบุดิจิทัลเท่านั้น) ตัวอย่างเช่น ตอนนี้คุณสามารถใช้ในโค้ด: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump($อาร์เรย์); // ["a" => 1, "b" => 2]
  • อนุญาตให้ใช้คีย์เวิร์ด "ใหม่" ในเครื่องมือเริ่มต้น เช่น ในคำจำกัดความของฟังก์ชันเป็นพารามิเตอร์เริ่มต้น หรือในแอตทริบิวต์อาร์กิวเมนต์ คลาส MyController { ฟังก์ชั่นสาธารณะ __ สร้าง ( Logger ส่วนตัว $logger = NullLogger ใหม่ (), ) {} }
  • เป็นไปได้ที่จะทำเครื่องหมายคุณสมบัติของคลาสสำหรับการเข้าถึงแบบอ่านอย่างเดียว (ข้อมูลในคุณสมบัติดังกล่าวสามารถเขียนได้เพียงครั้งเดียว หลังจากนั้นจะไม่สามารถเปลี่ยนแปลงได้) class PostData { ฟังก์ชั่นสาธารณะ __construct (สตริงแบบอ่านอย่างเดียวสาธารณะ $title, DateTimeImmutable $date แบบอ่านอย่างเดียวสาธารณะ ) {} } $post = โพสต์ใหม่ ('หัวข้อ', /* … */); $โพสต์->ชื่อ = 'อื่นๆ'; > ข้อผิดพลาด: ไม่สามารถแก้ไขคุณสมบัติแบบอ่านอย่างเดียว โพสต์::$title
  • มีการใช้ไวยากรณ์ใหม่สำหรับวัตถุที่เรียกได้ - ขณะนี้สามารถสร้างการปิดได้โดยการเรียกใช้ฟังก์ชันและส่งค่า "..." เป็นอาร์กิวเมนต์ (เช่น myFunc(...) แทนการปิด::fromCallable('myFunc ')): function foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • เพิ่มการสนับสนุนเต็มรูปแบบสำหรับประเภททางแยก ช่วยให้คุณสร้างประเภทใหม่โดยรวมสิ่งที่มีอยู่ได้ ต่างจากประเภทสหภาพซึ่งกำหนดคอลเลกชันของสองประเภทขึ้นไป ประเภททางแยกไม่จำเป็นต้องมีประเภทใด ๆ ที่ระบุไว้ แต่ต้องระบุประเภทที่ระบุทั้งหมดในชุดให้เต็ม ฟังก์ชั่น GenerateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $โพสต์->getId(); }
  • มีประเภทใหม่ "ไม่" ที่สามารถใช้เพื่อแจ้งเครื่องวิเคราะห์แบบคงที่ว่าฟังก์ชันจะยุติการทำงานของโปรแกรม เช่น โดยการโยนข้อยกเว้นหรือเรียกใช้ฟังก์ชันทางออก ฟังก์ชั่น dd (อินพุต $ แบบผสม): ไม่เคย { ออก; }
  • มีการเสนอฟังก์ชันใหม่ array_is_list ซึ่งช่วยให้คุณกำหนดได้ว่าคีย์ในอาร์เรย์ถูกจัดเรียงตามลำดับค่าตัวเลขที่เพิ่มขึ้น โดยเริ่มจาก 0: $list = [“a”, “b”, “c”]; array_is_list($รายการ); // true $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // เท็จ
  • ตอนนี้คุณสามารถใช้คีย์เวิร์ด "final" เพื่อป้องกันไม่ให้ค่าคงที่คลาสพาเรนต์ถูกแทนที่ คลาส Foo { สาธารณะขั้นสุดท้าย const X = "foo"; } คลาส Bar ขยาย Foo { public const X = "bar"; > ข้อผิดพลาดร้ายแรง: Bar::X ไม่สามารถแทนที่ค่าคงที่สุดท้าย Foo::X }
  • ฟังก์ชัน fsync และ fdatasync ได้รับการเสนอเพื่อบังคับให้บันทึกการเปลี่ยนแปลงจากดิสก์แคช $file = fopen("sample.txt", "w"); fwrite($file, "เนื้อหาบางส่วน"); if (fsync($file)) { echo "ไฟล์ได้รับการคงอยู่ในดิสก์เรียบร้อยแล้ว"; } fclose($ไฟล์);
  • เพิ่มความสามารถในการใช้คำนำหน้า "0o" และ "0O" สำหรับเลขฐานแปด นอกเหนือจากคำนำหน้า "0" ที่ใช้ก่อนหน้านี้ 016 === 0o16; // จริง 016 === 0O16; // จริง
  • มีการเสนอให้เลือก จำกัด การใช้ $GLOBALS ซึ่งจะนำไปสู่การละเมิดความเข้ากันได้แบบย้อนหลัง แต่จะทำให้การดำเนินการกับอาร์เรย์เร็วขึ้นอย่างมาก ตัวอย่างเช่น มีการพิจารณาความเป็นไปได้ในการปิดใช้งานการเขียนถึง $GLOBALS และส่งผ่าน $GLOBALS ด้วยตัวชี้ จากการวิเคราะห์แพ็คเกจ 2000 แพ็คเกจพบว่ามีเพียง 23 แพ็คเกจเท่านั้นที่จะได้รับผลกระทบจากการเปลี่ยนแปลงนี้ ตัวอย่างเช่น หากข้อเสนอได้รับการอนุมัติ 8.1 จะไม่รองรับนิพจน์เช่น: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; ไม่ได้ตั้งค่า($GLOBALS); by_ref($GLOBALS);
  • วิธีการภายในควรส่งคืนประเภทที่ถูกต้อง ใน PHP 8.1 การส่งคืนประเภทที่ไม่ตรงกับการประกาศฟังก์ชันจะทำให้เกิดคำเตือน แต่ใน PHP 9.0 คำเตือนจะถูกแทนที่ด้วยข้อผิดพลาด
  • งานยังคงดำเนินต่อไปในการถ่ายโอนฟังก์ชันจากการใช้ทรัพยากรไปสู่การจัดการวัตถุ ฟังก์ชัน finfo_* และ imap_* ถูกถ่ายโอนไปยังอ็อบเจ็กต์แล้ว
  • การส่งผ่านค่า Null เป็นอาร์กิวเมนต์ไปยังฟังก์ชันภายในที่ทำเครื่องหมายว่าไม่เป็นค่าว่างนั้นเลิกใช้แล้ว ใน PHP 8.1 การใช้โครงสร้างเช่น str_contains("string", null) จะทำให้เกิดคำเตือน และใน PHP 9 จะเกิดข้อผิดพลาด
  • เพิ่มการรองรับอัลกอริธึมการแฮช MurmurHash3 และ xxHash

ที่มา: opennet.ru

เพิ่มความคิดเห็น