การอ้างอิง PHP 7.2
การอ้างอิง PHP 7.1
PHP 7 เปิดตัวเมื่อวันที่ 3 ธันวาคม 2558 โดยมาพร้อมกับฟีเจอร์ใหม่ การเปลี่ยนแปลง และความเข้ากันได้แบบย้อนหลังหลายประการตามที่ระบุไว้ด้านล่าง
ผลงาน
คุณสมบัติ
ตัวดำเนินการเปรียบเทียบแบบรวม
ตัวดำเนินการ Null Coalesce
การประกาศประเภทสเกลาร์
ประกาศประเภทการส่งคืน
ชั้นเรียนที่ไม่ระบุชื่อ
Unicode Codepoint Escape ไวยากรณ์
วิธีการปิด call()
กรองข้อมูลที่ไม่ซีเรีย unserialize()
คลาส IntlChar
ความคาดหวัง
ประกาศ use
กลุ่ม
ตัวสร้างนิพจน์ส่งคืน
คณะผู้แทนเครื่องกำเนิดไฟฟ้า
การหารจำนวนเต็มด้วย intdiv()
session_start()
ตัวเลือก
preg_replace_callback_array()
ฟังก์ชัน
ฟังก์ชัน CSPRNG
รองรับค่าคงที่อาร์เรย์ใน define()
การเพิ่มการสะท้อน
การเปลี่ยนแปลง
คลายข้อจำกัดของคำที่สงวนไว้
ไวยากรณ์ตัวแปรชุด
ข้อยกเว้นในเครื่องยนต์
อินเทอร์เฟซแบบโยนได้
ความหมายจำนวนเต็ม
ส่วนขยาย JSON แทนที่ด้วย JSOND
ZPP ล้มเหลวในการโอเวอร์โฟลว์
แก้ไขพฤติกรรมของ foreach()
การเปลี่ยนแปลงพฤติกรรมของ list()
การเปลี่ยนแปลงการหารด้วย Zero Semantics
แก้ไขค่าส่งคืนตัวจัดการเซสชันแบบกำหนดเอง
การเลิกใช้งานตัวสร้างสไตล์ PHP 4
การลบคำเตือน date.timezone
การลบแท็ก PHP ทางเลือก
การลบบล็อกเริ่มต้นหลายรายการในคำสั่ง Switch
การลบคำจำกัดความใหม่ของพารามิเตอร์ที่มีชื่อซ้ำกัน
การลบ API เซิร์ฟเวอร์ที่ไม่ทำงาน
การลบการสนับสนุน Hex ในสตริงตัวเลข
การลบฟังก์ชันการทำงานที่เลิกใช้แล้ว
การจัดประเภทใหม่และการลบประกาศ E_STRICT
การเลิกใช้ตัวเลือก Salt สำหรับ password_hash()
ข้อผิดพลาดในตัวอักษรฐานแปดไม่ถูกต้อง
substr()
เปลี่ยนค่าส่งคืน
คำถามที่พบบ่อย
เกิดอะไรขึ้นกับ PHP 6?
ส่วนที่ยอดเยี่ยมที่สุดอย่างไม่อาจปฏิเสธได้เกี่ยวกับ PHP 7 คือการเพิ่มประสิทธิภาพอันน่าทึ่งให้กับแอปพลิเคชันต่างๆ นี่เป็นผลมาจากการปรับโครงสร้าง Zend Engine ใหม่เพื่อใช้โครงสร้างข้อมูลที่กะทัดรัดมากขึ้น และการจัดสรรฮีป/การจัดสรรคืนน้อยลง
ประสิทธิภาพที่เพิ่มขึ้นจากแอปพลิเคชันในโลกแห่งความเป็นจริงจะแตกต่างกันไป แม้ว่าแอปพลิเคชันจำนวนมากดูเหมือนจะได้รับการเพิ่มประสิทธิภาพ ~100% - โดยมีการใช้หน่วยความจำน้อยลงเช่นกัน
โค้ดเบสที่ได้รับการปรับโครงสร้างใหม่ให้โอกาสเพิ่มเติมสำหรับการเพิ่มประสิทธิภาพในอนาคตเช่นกัน (เช่น การคอมไพล์ JIT) ดูเหมือนว่าเวอร์ชัน PHP ในอนาคตจะยังคงได้รับการปรับปรุงประสิทธิภาพต่อไปเช่นกัน
การเปรียบเทียบแผนภูมิประสิทธิภาพของ PHP 7:
เติมพลังให้กับเว็บด้วย PHP 7
เกณฑ์มาตรฐานจาก Sydney Talk ของ Rasmus
ตัวดำเนินการเปรียบเทียบแบบรวม (หรือตัวดำเนินการยานอวกาศ) เป็นการจดชวเลขสำหรับการเปรียบเทียบแบบสามทางจากตัวถูกดำเนินการสองตัว มีค่าส่งคืนจำนวนเต็มที่สามารถเป็นได้ทั้ง:
จำนวนเต็มบวก (ถ้าตัวถูกดำเนินการทางซ้ายมากกว่าตัวถูกดำเนินการทางขวา)
0 (ถ้าทั้งสองตัวถูกดำเนินการเท่ากัน)
จำนวนเต็มลบ (ถ้าตัวถูกดำเนินการทางขวามากกว่าตัวถูกดำเนินการทางซ้าย)
ตัวดำเนินการมีลำดับความสำคัญเดียวกันกับตัวดำเนินการเท่าเทียมกัน ( ==
, !=
, ===
, !==
) และมีลักษณะการทำงานเหมือนกันทุกประการกับตัวดำเนินการเปรียบเทียบหลวมอื่นๆ ( <
, >=
ฯลฯ) มันไม่เชื่อมโยงกันเหมือนพวกมันเช่นกัน ดังนั้นการผูกมัดของตัวถูกดำเนินการ (เช่น 1 <=> 2 <=> 3
) จึงไม่ได้รับอนุญาต
// เปรียบเทียบ strings lexiicallyvar_dump('PHP' <=> 'Node'); // int(1)// เปรียบเทียบตัวเลขด้วย sizevar_dump(123 <=> 456); // int(-1)// เปรียบเทียบองค์ประกอบอาร์เรย์ที่สอดคล้องกับ one-anothervar_dump(['a', 'b'] <=> ['a', 'b']); // int(0)
วัตถุไม่สามารถเปรียบเทียบได้ ดังนั้นการใช้พวกมันเป็นตัวถูกดำเนินการกับตัวดำเนินการนี้จะส่งผลให้เกิดพฤติกรรมที่ไม่ได้กำหนดไว้
RFC: ตัวดำเนินการเปรียบเทียบแบบรวม
ตัวดำเนินการรวมค่าว่าง (หรือตัวดำเนินการประกอบไปด้วย isset) เป็นรูปแบบชวเลขสำหรับดำเนินการตรวจสอบ isset()
ในตัวดำเนินการประกอบไปด้วย นี่เป็นสิ่งทั่วไปที่ต้องทำในแอปพลิเคชัน และดังนั้นจึงมีการนำไวยากรณ์ใหม่มาใช้เพื่อวัตถุประสงค์ที่แน่นอนนี้
// ก่อน PHP 7 code$route = isset($_GET['route']) ? $_GET['route'] : 'index';// PHP 7+ code$route = $_GET['route'] ?? 'ดัชนี';
RFC: ตัวดำเนินการ Null Coalesce
การประกาศประเภทสเกลาร์มีสองรูปแบบ: แบบบีบบังคับ (ค่าเริ่มต้น) และ แบบเข้มงวด ขณะนี้สามารถบังคับใช้ประเภทพารามิเตอร์ต่อไปนี้ได้ (ไม่ว่าจะบังคับหรือเข้มงวด): สตริง ( string
), จำนวนเต็ม ( int
), ตัวเลขทศนิยม ( float
) และบูลีน ( bool
) โดยเพิ่มประเภทอื่นๆ ที่นำมาใช้ในเวอร์ชัน PHP 5.x: ชื่อคลาส อินเทอร์เฟซ array
และ callable
.
// ฟังก์ชั่นโหมดบีบบังคับ sumOfInts(int ...$ints) { กลับ array_sum($ints); }var_dump(sumOfInts(2, '3', 4.1)); // int(9)
หากต้องการเปิดใช้งานโหมดเข้มงวด ต้องวางคำสั่ง declare()
คำสั่งเดียวไว้ที่ด้านบนของไฟล์ ซึ่งหมายความว่าความเข้มงวดในการพิมพ์สเกลาร์ได้รับการกำหนดค่าตามไฟล์ คำสั่งนี้ไม่เพียงส่งผลต่อการประกาศประเภทของพารามิเตอร์เท่านั้น แต่ยังส่งผลต่อประเภทการส่งคืนของฟังก์ชันด้วย (ดูการประกาศประเภทการส่งคืน) ฟังก์ชัน PHP ในตัว และฟังก์ชันจากส่วนขยายที่โหลด
หากการตรวจสอบประเภทล้มเหลว ข้อยกเว้น TypeError
(ดูข้อยกเว้นในกลไก) จะถูกส่งออกไป ความผ่อนปรนเพียงอย่างเดียวที่มีอยู่ในการพิมพ์ที่เข้มงวดคือการแปลงจำนวนเต็มให้เป็นจำนวนลอยโดยอัตโนมัติ (แต่ไม่ใช่ในทางกลับกัน) เมื่อมีการระบุจำนวนเต็มในบริบทแบบลอย
ประกาศ (strict_types = 1); ฟังก์ชั่นคูณ (float $x, float $y) { กลับ $x * $y; } เพิ่มฟังก์ชัน (int $x, int $y) { กลับ $x + $y; }var_dump(คูณ(2, 3.5)); // float(7)var_dump(เพิ่ม('2', 3)); // ข้อผิดพลาดร้ายแรง: Uncaught TypeError: อาร์กิวเมนต์ 1 ที่ส่งผ่านไปยัง add() ต้องเป็นประเภทจำนวนเต็ม สตริงที่กำหนด...
โปรดทราบว่า เฉพาะ บริบทการร้องขอ เท่านั้นที่จะนำไปใช้เมื่อมีการตรวจสอบประเภท ซึ่งหมายความว่าการพิมพ์ที่เข้มงวดจะใช้กับการเรียกใช้ฟังก์ชัน/เมธอดเท่านั้น และไม่ใช่กับคำจำกัดความของฟังก์ชัน/เมธอด ในตัวอย่างข้างต้น ฟังก์ชันทั้งสองอาจถูกประกาศในไฟล์เข้มงวดหรือไฟล์บีบบังคับ แต่ตราบใดที่มันถูกเรียกในไฟล์เข้มงวด กฎการพิมพ์ที่เข้มงวดก็จะถูกนำมาใช้
บีซีแตก
คลาสที่มีชื่อ int
, string
, float
และ bool
ไม่ได้รับอนุญาตแล้ว
RFC: การประกาศประเภทสเกลาร์
การประกาศประเภทการคืนสินค้าจะเปิดใช้งานสำหรับประเภทการคืนสินค้าของฟังก์ชัน วิธีการ หรือการปิดที่จะระบุ ประเภทการส่งคืนต่อไปนี้ได้รับการสนับสนุน: string
, int
, float
, bool
, array
, callable
, self
(วิธีการเท่านั้น), parent
(วิธีการเท่านั้น), Closure
, ชื่อของคลาส และชื่อของอินเทอร์เฟซ
ฟังก์ชั่น arraysSum(array ...$arrays): array{ return array_map(function(array $array): int { return array_sum($array); }, $อาร์เรย์); }print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));/* OutputArray( [0] => 6 [1] => 15 [2] => 24)*/
ในส่วนที่เกี่ยวกับการพิมพ์ย่อย มีการเลือก ค่าคงที่ สำหรับประเภทการส่งคืน ซึ่งหมายความว่าเมื่อเมธอดถูกแทนที่ในคลาสย่อยหรือนำไปใช้ตามที่กำหนดไว้ในสัญญา ประเภทการส่งคืนจะต้องตรงกับวิธีการที่ใช้ (อีกครั้ง) ทุกประการ
คลาส A {}คลาส B ขยาย A {}คลาส C { การทดสอบฟังก์ชั่นสาธารณะ () : A { คืน A ใหม่; - } คลาส D ขยาย C { // วิธีการแทนที่ C::test() : การทดสอบฟังก์ชันสาธารณะ () : B // ข้อผิดพลาดร้ายแรงเนื่องจากความแปรปรวนไม่ตรงกัน { คืน B ใหม่; - -
วิธีการแทนที่ D::test() : B
ทำให้เกิด E_COMPILE_ERROR
เนื่องจากไม่อนุญาตให้มีความแปรปรวนร่วม เพื่อให้สิ่งนี้ใช้งานได้ วิธี D::test()
ต้องมีประเภทการส่งคืนเป็น A
คลาส A {}อินเทอร์เฟซ SomeInterface { การทดสอบฟังก์ชั่นสาธารณะ () : A; }คลาส B ใช้ SomeInterface { public function test() : A // ดีไปหมด! { กลับเป็นโมฆะ; // ข้อผิดพลาดร้ายแรง: Uncaught TypeError: ค่าที่ส่งคืนของ B::test() ต้องเป็นอินสแตนซ์ของ A, ส่งคืนค่า null... - -
ในครั้งนี้ วิธีการนำไปใช้ทำให้เกิดข้อยกเว้น TypeError
(ดูข้อยกเว้นในกลไกจัดการ) ที่จะเกิดขึ้นเมื่อดำเนินการ เนื่องจาก null
ไม่ใช่ประเภทการส่งคืนที่ถูกต้อง - มีเพียงอินสแตนซ์ของคลาส A
เท่านั้นที่สามารถส่งคืนได้
RFC: การประกาศประเภทการคืนสินค้า
คลาสที่ไม่ระบุชื่อมีประโยชน์เมื่อจำเป็นต้องสร้างออบเจ็กต์แบบเรียบง่ายที่ใช้ครั้งเดียว
// ตัวบันทึกคลาสโค้ดก่อน PHP 7 { บันทึกฟังก์ชันสาธารณะ($msg) { เสียงสะท้อน $msg; - }$util->setLogger(new Logger());// PHP 7+ code$util->setLogger(คลาสใหม่ { บันทึกฟังก์ชันสาธารณะ($msg) { เสียงสะท้อน $msg; - -
พวกเขาสามารถส่งอาร์กิวเมนต์ผ่านไปยังคอนสตรัคเตอร์ ขยายคลาสอื่นๆ ใช้อินเทอร์เฟซ และใช้คุณลักษณะเหมือนกับที่คลาสปกติสามารถทำได้:
คลาส SomeClass {} อินเทอร์เฟซ SomeInterface {} ลักษณะ SomeTrait {}var_dump (คลาสใหม่ (10) ขยาย SomeClass ใช้ SomeInterface { ส่วนตัว $num; ฟังก์ชั่นสาธารณะ __construct ($num) { $นี่->num = $num; } ใช้ SomeTrait; });/** Output:object(class@anonymous)#1 (1) { ["รหัสบรรทัดคำสั่ง0x104c5b612"class@anonymous":private]=> int(10)}*/
การซ้อนคลาสที่ไม่ระบุตัวตนภายในคลาสอื่นไม่ได้ให้สิทธิ์ในการเข้าถึงเมธอดหรือคุณสมบัติส่วนตัวหรือที่ได้รับการป้องกันของคลาสภายนอกนั้น เพื่อที่จะใช้คุณสมบัติหรือวิธีการป้องกันของคลาสภายนอก คลาสที่ไม่ระบุชื่อสามารถขยายคลาสภายนอกได้ หากต้องการใช้คุณสมบัติส่วนตัวหรือที่ได้รับการป้องกันของคลาสภายนอกในคลาสที่ไม่ระบุชื่อจะต้องส่งผ่านตัวสร้าง:
<?phpclass ด้านนอก { ส่วนตัว $prop = 1; ป้องกัน $prop2 = 2; ฟังก์ชั่นที่ได้รับการป้องกัน func1() { กลับ 3; } ฟังก์ชั่นสาธารณะ func2() { กลับคลาสใหม่($this->prop) ขยายด้านนอก { ส่วนตัว $prop3; ฟังก์ชั่นสาธารณะ __construct($prop) { $นี่->prop3 = $prop; } ฟังก์ชั่นสาธารณะ func3() { กลับ $this->prop2 + $this->prop3 + $this->func1(); - - - }echo (ด้านนอกใหม่)->func2()->func3(); // 6
RFC: คลาสที่ไม่ระบุชื่อ
ซึ่งช่วยให้สามารถส่งออกจุดโค้ดยูนิโค้ดที่เข้ารหัส UTF-8 ในรูปแบบสตริงที่มีเครื่องหมายคำพูดคู่หรือแบบ Heredoc ยอมรับจุดโค้ดที่ถูกต้องใดๆ โดยที่เลข 0
นำหน้าเป็นทางเลือก
เสียงสะท้อน "u{aa}"; // ªecho "u{0000aa}"; // ª (เหมือนเดิมแต่ใส่ 0 นำหน้าก็ได้)echo "u{9999}"; // 香
RFC: Unicode Codepoint Escape ไวยากรณ์
วิธี call()
ใหม่สำหรับการปิดใช้เป็นวิธีเรียกการปิดแบบชวเลขในขณะที่ผูกขอบเขตอ็อบเจ็กต์เข้ากับมัน สิ่งนี้จะสร้างโค้ดที่มีประสิทธิภาพและกะทัดรัดมากขึ้นโดยไม่จำเป็นต้องสร้างการปิดระดับกลางก่อนที่จะเรียกใช้
คลาส A {private $x = 1;}// ก่อน PHP 7 code$getXCB = function() {return $this->x;};$getX = $getXCB->bindTo(new A, 'A'); // ระดับกลาง closureecho $getX(); // 1// PHP 7+ code$getX = function() {return $this->x;};echo $getX->call(new A); // 1
RFC: ปิด::โทร
unserialize()
คุณลักษณะนี้พยายามที่จะให้ความปลอดภัยที่ดีขึ้นเมื่อยกเลิกการซีเรียลไลซ์ออบเจ็กต์กับข้อมูลที่ไม่น่าเชื่อถือ โดยจะป้องกันการแทรกโค้ดที่เป็นไปได้โดยทำให้นักพัฒนาสามารถไวท์ลิสต์คลาสที่ไม่สามารถซีเรียลไลซ์ได้
// แปลงวัตถุทั้งหมดเป็น __PHP_Incomplete_Class object$data = unserialize($foo, ["allowed_classes" => false]);// แปลงวัตถุทั้งหมดเป็น __PHP_Incomplete_Class object ยกเว้น MyClass และ MyClass2$data = unserialize($foo, [" Allow_classes" => ["MyClass", "MyClass2"]]);// พฤติกรรมเริ่มต้น (เหมือนกับการละเว้นวินาที อาร์กิวเมนต์) ที่ยอมรับทุกคลาส$data = unserialize($foo, ["allowed_classes" => true]);
RFC: กรองข้อมูลที่ไม่ซีเรียลไลซ์ ()
IntlChar
คลาส IntlChar
ใหม่พยายามที่จะเปิดเผยฟังก์ชันการทำงานของ ICU เพิ่มเติม คลาสนี้กำหนดวิธีการคงที่และค่าคงที่จำนวนหนึ่งที่สามารถใช้เพื่อจัดการอักขระ Unicode
printf('%x', IntlChar::CODEPOINT_MAX); // 10ffffecho IntlChar::charName('@'); // เชิงพาณิชย์ ATvar_dump(IntlChar::ispunct('!')); //บูล(จริง)
เพื่อที่จะใช้คลาสนี้ จะต้องติดตั้งส่วนขยาย Intl
บีซีแตก
คลาสในเนมสเปซโกลบอลต้องไม่เรียกว่า IntlChar
RFC: คลาส IntlChar
ความคาดหวังคือการปรับปรุงที่เข้ากันได้แบบย้อนหลังกับฟังก์ชัน assert()
แบบเก่า เปิดใช้งานการยืนยันต้นทุนเป็นศูนย์ในรหัสการผลิต และให้ความสามารถในการส่งข้อยกเว้นแบบกำหนดเองเมื่อมีข้อผิดพลาด
ต้นแบบของฟังก์ชัน assert()
มีดังนี้:
void assert (mixed $expression [, mixed $message]);
เช่นเดียวกับ API เก่า หาก $expression
เป็นสตริง ก็จะถูกประเมิน หากอาร์กิวเมนต์แรกเป็นเท็จ การยืนยันจะล้มเหลว อาร์กิวเมนต์ที่สองอาจเป็นสตริงธรรมดา (ทำให้ AssertionError ถูกทริกเกอร์) หรือออบเจ็กต์ข้อยกเว้นแบบกำหนดเองที่มีข้อความแสดงข้อผิดพลาด
ini_set('assert.Exception', 1);class CustomError ขยาย AssertionError {}assert(false, new CustomError('ข้อความแสดงข้อผิดพลาดบางอย่าง'));
ด้วยคุณสมบัตินี้มาพร้อมกับการตั้งค่า PHP.ini สองแบบ (พร้อมกับค่าเริ่มต้น):
zend.assertions = 1
ยืนยันข้อยกเว้น = 0
zend.assertions มีสามค่า:
1 = สร้างและรันโค้ด (โหมดการพัฒนา)
0 = สร้างโค้ดและข้ามไปที่รันไทม์
-1 = ไม่ต้องสร้างโค้ดใดๆ (ต้นทุนเป็นศูนย์, โหมดการผลิต)
assert.Exception หมายความว่ามีข้อยกเว้นเกิดขึ้นเมื่อการยืนยันล้มเหลว สิ่งนี้จะถูกปิดโดยค่าเริ่มต้นเพื่อให้ยังคงเข้ากันได้กับฟังก์ชัน assert()
แบบเก่า
RFC: ความคาดหวัง
use
กลุ่ม สิ่งนี้ทำให้สามารถจัดกลุ่มการประกาศ use
หลายรายการตามเนมสเปซพาเรนต์ การดำเนินการนี้พยายามลบคำฟุ่มเฟือยของโค้ดเมื่อนำเข้าคลาส ฟังก์ชัน หรือค่าคงที่หลายรายการที่อยู่ภายใต้เนมสเปซเดียวกัน
// โค้ดก่อน PHP 7ใช้ somenamespaceClassA;ใช้ somenamespaceClassB;ใช้ somenamespaceClassC เป็น C;ใช้ฟังก์ชัน somenamespacefn_a;ใช้ฟังก์ชัน somenamespacefn_b;ใช้ฟังก์ชัน somenamespace fn_c;ใช้ const somenamespaceConstA;ใช้ const somenamespaceConstB;ใช้ const somenamespaceConstC;// การใช้โค้ด PHP 7+ somenamespace{ClassA, ClassB, ClassC as C};ใช้ฟังก์ชัน somenamespace{fn_a, fn_b, fn_c};use const somenamespace{ConstA, ConstB, ConstC};
RFC: การประกาศการใช้กลุ่ม
คุณลักษณะนี้สร้างขึ้นจากฟังก์ชันการทำงานของตัวสร้างที่นำมาใช้ใน PHP 5.5 ช่วยให้สามารถใช้คำสั่ง return
ภายในตัวสร้างเพื่อให้สามารถส่งคืน นิพจน์ สุดท้ายได้ (ไม่อนุญาตให้ส่งคืนโดยการอ้างอิง) ค่านี้สามารถดึงออกมาได้โดยใช้ Generator::getReturn()
ใหม่ ซึ่งอาจใช้ได้เฉพาะเมื่อตัวสร้างมีค่าผลผลิตเสร็จสิ้นแล้วเท่านั้น
// ไวยากรณ์ IIFE เป็นไปได้แล้ว - ดูส่วนย่อยของไวยากรณ์ตัวแปรชุดในส่วนการเปลี่ยนแปลง$gen = (function() { ให้ผลผลิต 1; ให้ผลผลิต 2; ส่งกลับ 3; })();foreach ($gen เป็น $val) { echo $val, PHP_EOL; }echo $gen->getReturn(), PHP_EOL;// เอาต์พุต: // 1// 2// 3
ความสามารถในการส่งคืนค่าสุดท้ายจากตัวสร้างอย่างชัดเจนนั้นเป็นความสามารถที่มีประโยชน์ เนื่องจากช่วยให้สามารถส่งคืนค่าสุดท้ายโดยตัวสร้าง (จากการคำนวณโครูทีนบางรูปแบบ) ซึ่งสามารถจัดการโดยเฉพาะโดยโค้ดไคลเอ็นต์ที่เรียกใช้ตัวสร้าง วิธีนี้ง่ายกว่าการบังคับให้รหัสไคลเอ็นต์ตรวจสอบก่อนว่าได้ค่าสุดท้ายมาหรือไม่ และหากเป็นเช่นนั้น ให้จัดการกับค่านั้นโดยเฉพาะ
RFC: ตัวสร้างนิพจน์ส่งคืน
การมอบหมายตัวสร้างสร้างขึ้นจากความสามารถในการส่งคืนนิพจน์จากตัวสร้าง ทำสิ่งนี้โดยใช้ไวยากรณ์ใหม่ของ yield from <expr>
โดยที่อาจเป็นอ็อบเจ็กต์หรืออาร์เรย์ Traversable
สิ่งนี้จะเป็นขั้นสูงจนกว่าจะใช้ไม่ได้อีกต่อไป จากนั้นการดำเนินการจะดำเนินต่อไปในตัวสร้างการเรียก คุณลักษณะนี้ช่วยให้สามารถแยกย่อยคำสั่ง yield
ออกเป็นการดำเนินการที่มีขนาดเล็กลงได้ ดังนั้นจึงส่งเสริมโค้ดที่สะอาดกว่าและสามารถนำกลับมาใช้ใหม่ได้มากขึ้น
ฟังก์ชั่นเจน() { ให้ผลผลิต 1; ผลผลิต 2; ผลตอบแทนที่ได้รับจาก gen2(); }ฟังก์ชัน gen2() { ผลผลิต 3; กลับ 4; }$gen = gen();foreach ($gen เป็น $val) { เสียงสะท้อน $val, PHP_EOL; }echo $gen->getReturn();// เอาต์พุต// 1// 2// 3// 4
RFC: การมอบหมายตัวสร้าง
intdiv()
ฟังก์ชัน intdiv()
ได้รับการแนะนำเพื่อจัดการกับการหารโดยส่งคืนจำนวนเต็ม
var_dump(intdiv(10, 3)); // int(3)
บีซีแตก
ฟังก์ชันในเนมสเปซส่วนกลางต้องไม่เรียกว่า intdiv
RFC: intdiv()
session_start()
ตัวเลือก คุณลักษณะนี้ช่วยให้สามารถส่งผ่านตัวเลือกต่างๆ ไปยังฟังก์ชัน session_start()
ได้ ใช้เพื่อตั้งค่าตัวเลือก php.ini ตามเซสชัน:
session_start(['cache_limiter' => 'ส่วนตัว']); // ตั้งค่าตัวเลือก session.cache_limiter เป็นส่วนตัว
คุณลักษณะนี้ยังแนะนำการตั้งค่า php.ini ใหม่ ( session.lazy_write
) ซึ่งตามค่าเริ่มต้นจะตั้งค่าเป็นจริง และหมายความว่าข้อมูลเซสชันจะถูกเขียนใหม่หากมีการเปลี่ยนแปลงเท่านั้น
RFC: แนะนำตัวเลือก session_start()
preg_replace_callback_array()
ฟังก์ชัน ฟังก์ชันใหม่นี้ช่วยให้โค้ดเขียนได้ชัดเจนยิ่งขึ้นเมื่อใช้ฟังก์ชัน preg_replace_callback()
ก่อน PHP 7 การเรียกกลับที่จำเป็นต้องดำเนินการต่อนิพจน์ทั่วไปจำเป็นต้องมีฟังก์ชันการเรียกกลับ (พารามิเตอร์ตัวที่สองของ preg_replace_callback()
) ที่ต้องเสียด้วยการแตกแขนงจำนวนมาก (วิธีการแฮ็กที่ดีที่สุด)
ขณะนี้ สามารถลงทะเบียนการเรียกกลับกับนิพจน์ทั่วไปแต่ละรายการได้โดยใช้อาเรย์แบบเชื่อมโยง โดยที่คีย์คือนิพจน์ทั่วไป และค่าคือการเรียกกลับ
ลายเซ็นฟังก์ชัน:
string preg_replace_callback_array(array $regexesAndCallbacks, string $input);
$tokenStream = []; // [tokenName, lexeme] pairs$input = <<<'end'$a = 3; // การเริ่มต้นตัวแปรสิ้นสุด;// ก่อน PHP 7 codepreg_replace_callback ( [ '~$[a-z_][azd_]*~i', '~=~', '~[d]+~', '~;~', '~//.*~' ], ฟังก์ชัน ($match) ใช้ (&$tokenStream) { if (strpos($match[0], '$') === 0) { $tokenStream[] = ['T_VARIABLE', $match[0]] ; } elseif (strpos($match[0], '=') === 0) { $tokenStream[] = ['T_ASSIGN', $match[0]]; } elseif (ctype_digit($match[0])) { $tokenStream[] = ['T_NUM', $match[0]]; } elseif (strpos($match[0], ';') === 0) { $tokenStream[] = ['T_TERMINATE_STMT', $match[0]]; } elseif (strpos($match[0], '//') === 0) { $tokenStream[] = ['T_COMMENT', $match[0]]; - }, $input);// PHP 7+ codepreg_replace_callback_array( [ '~$[a-z_][azd_]*~i' => function ($match) use (&$tokenStream) { $tokenStream[] = ['T_VARIABLE', $match[0]]; }, '~=~' => function ($match) use (&$tokenStream) { $tokenStream[] = ['T_ASSIGN', $match[0]]; }, '~[d]+~' => function ($match) use (&$tokenStream) { $tokenStream[] = ['T_NUM', $match[0]]; }, '~;~' => ฟังก์ชั่น ($match) ใช้ (&$tokenStream) { $tokenStream[] = ['T_TERMINATE_STMT', $match[0]]; }, '~//.*~' => function ($match) use (&$tokenStream) { $tokenStream[] = ['T_COMMENT', $match[0]]; - ], $อินพุต);
บีซีแตก
ฟังก์ชันในเนมสเปซส่วนกลางจะต้องไม่ถูกเรียกว่า preg_replace_callback_array
RFC: เพิ่มฟังก์ชัน preg_replace_callback_array
คุณลักษณะนี้แนะนำฟังก์ชันใหม่สองฟังก์ชันสำหรับการสร้างจำนวนเต็มและสตริงที่ปลอดภัยด้วยการเข้ารหัส พวกเขาเปิดเผย API ที่เรียบง่ายและไม่ขึ้นกับแพลตฟอร์ม
ลายเซ็นฟังก์ชัน:
string random_bytes(int length); int random_int(int min, int max);
ฟังก์ชันทั้งสองจะปล่อยข้อยกเว้น Error
หากไม่พบแหล่งที่มาของการสุ่มที่เพียงพอ
บีซีแตก
ฟังก์ชันในเนมสเปซส่วนกลางต้องไม่เรียกว่า random_int
หรือ random_bytes
RFC: CSPRNG สำหรับผู้ใช้ที่ใช้งานง่าย
define()
ความสามารถในการกำหนดค่าคงที่อาร์เรย์ถูกนำมาใช้ใน PHP 5.6 โดยใช้คีย์เวิร์ด const
ความสามารถนี้ได้ถูกนำไปใช้กับฟังก์ชัน define()
ด้วยเช่นกัน:
กำหนด('ALLOWED_IMAGE_EXTENSIONS', ['jpg', 'jpeg', 'gif', 'png']);
RFC: ไม่มี RFC ที่พร้อมใช้งาน
คลาสการสะท้อนกลับใหม่สองคลาสได้รับการแนะนำใน PHP 7 คลาสแรกคือ ReflectionGenerator
ซึ่งใช้สำหรับการวิปัสสนาเกี่ยวกับเครื่องกำเนิดไฟฟ้า:
คลาส ReflectionGenerator { public __construct(Generator $gen) อาเรย์สาธารณะ getTrace($options = DEBUG_BACKTRACE_PROVIDE_OBJECT) สาธารณะ int getExecutingLine (เป็นโมฆะ) สตริงสาธารณะ getExecutingFile (เป็นโมฆะ) สาธารณะ ReflectionFunctionAbstract getFunction (เป็นโมฆะ) วัตถุสาธารณะ getThis (เป็นโมฆะ) เครื่องกำเนิดไฟฟ้าสาธารณะ getExecutingGenerator (เป็นโมฆะ) -
อย่างที่สองคือ ReflectionType
เพื่อรองรับคุณสมบัติการประกาศแบบสเกลาร์และแบบส่งคืนได้ดียิ่งขึ้น:
คลาส ReflectionType { บูลสาธารณะ AllowNull (โมฆะ) บูลสาธารณะ isBuiltin (โมฆะ) สตริงสาธารณะ __toString (โมฆะ) -
นอกจากนี้ยังมีการแนะนำวิธีการใหม่สองวิธีใน ReflectionParameter
:
พารามิเตอร์การสะท้อนคลาส { // ... บูลสาธารณะ hasType(void) สาธารณะ ReflectionType getType(void) -
เช่นเดียวกับสองวิธีใหม่ใน ReflectionFunctionAbstract
:
คลาส ReflectionFunctionAbstract { // ... บูลสาธารณะ hasReturnType(void) สาธารณะ ReflectionType getReturnType(void) -
บีซีแตก
คลาสในเนมสเปซส่วนกลางต้องไม่เรียกว่า ReflectionGenerator
หรือ ReflectionType
RFC: ไม่มี RFC ที่พร้อมใช้งาน
คำที่สงวนไว้ทั่วโลกเป็นชื่อคุณสมบัติ ค่าคงที่ และวิธีภายในคลาส อินเทอร์เฟซ และลักษณะต่างๆ ได้รับอนุญาตแล้ว ซึ่งจะช่วยลดพื้นที่ของการแบ่ง BC เมื่อมีการแนะนำคีย์เวิร์ดใหม่ และหลีกเลี่ยงข้อจำกัดในการตั้งชื่อบน API
สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อสร้าง DSL ภายในด้วยอินเทอร์เฟซที่คล่องแคล่ว:
// 'ใหม่', 'ส่วนตัว' และ 'สำหรับ' ก่อนหน้านี้ unusableProject::new('ชื่อโครงการ')->ส่วนตัว()->สำหรับ('วัตถุประสงค์ที่นี่')->กับ('ชื่อผู้ใช้ที่นี่');
ข้อจำกัดเพียงอย่างเดียวคือ class
คีย์เวิร์ดยังไม่สามารถใช้เป็นชื่อคงที่ได้ มิฉะนั้นอาจขัดแย้งกับไวยากรณ์การแก้ไขชื่อคลาส ( ClassName::class
)
RFC: Lexer ที่ละเอียดอ่อนตามบริบท
การเปลี่ยนแปลงนี้ทำให้ตัวดำเนินการตัวแปรใน PHP มีความตั้งฉากมากขึ้น ช่วยให้สามารถรวมตัวดำเนินการใหม่ๆ จำนวนมากที่ไม่ได้รับอนุญาตก่อนหน้านี้ และแนะนำวิธีใหม่ในการบรรลุการดำเนินการแบบเก่าในโค้ด terser
// การซ้อน ::$foo::$bar::$baz // เข้าถึงคุณสมบัติ $baz ของคุณสมบัติ $foo::$bar// การซ้อน ()foo()() // เรียกใช้การส่งคืนของ foo() // ตัวดำเนินการในนิพจน์ที่อยู่ใน ()(function () {})() // ไวยากรณ์ IIFE จาก JS
ความสามารถในการรวมตัวดำเนินการตัวแปรโดยพลการนั้นมาจากการย้อนกลับซีแมนทิกส์การประเมินของการอ้างอิงตัวแปรทางอ้อม คุณสมบัติ และเมธอด ลักษณะการทำงานใหม่นี้ใช้งานง่ายกว่าและเป็นไปตามลำดับการประเมินจากซ้ายไปขวาเสมอ:
// ความหมายเก่า // ความหมายใหม่$$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz' ]$foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz']$foo->$bar['baz']( ) $foo->{$bar['baz']}() ($foo->$bar)['baz']() ฟู::$bar['baz']() ฟู::{$bar['baz']}() (ฟู::$bar)['baz']()
บีซีแตก
รหัสที่อาศัยลำดับการประเมินแบบเก่าจะต้องถูกเขียนใหม่เพื่อใช้ลำดับการประเมินนั้นอย่างชัดเจนด้วยเครื่องหมายปีกกา (ดูคอลัมน์กลางด้านบน) สิ่งนี้จะทำให้โค้ดทั้งฟอร์เวิร์ดเข้ากันได้กับ PHP 7.x และเข้ากันได้กับ PHP 5.x แบบย้อนหลัง
RFC: ไวยากรณ์ตัวแปรที่สม่ำเสมอ
ข้อยกเว้นในกลไกจะแปลงข้อผิดพลาดร้ายแรงและข้อผิดพลาดร้ายแรงที่สามารถกู้คืนได้จำนวนมากให้เป็นข้อยกเว้น ซึ่งช่วยให้แอปพลิเคชั่นลดระดับลงอย่างสวยงามผ่านขั้นตอนการจัดการข้อผิดพลาดแบบกำหนดเอง นอกจากนี้ยังหมายความว่าคุณลักษณะที่ขับเคลื่อนด้วยการล้างข้อมูล เช่น ส่วนคำสั่ง finally
และตัวทำลายอ็อบเจ็กต์จะถูกดำเนินการในขณะนี้ นอกจากนี้ เมื่อใช้ข้อยกเว้นสำหรับข้อผิดพลาดของแอปพลิเคชัน การติดตามสแต็กจะถูกสร้างขึ้นสำหรับข้อมูลการดีบักเพิ่มเติม
ฟังก์ชั่น sum(float ...$numbers) : float{ return array_sum($numbers); }ลอง { $total = sum(3, 4, null); } catch (TypeError $typeErr) { // ข้อผิดพลาดประเภทการจัดการที่นี่}
ลำดับชั้นข้อยกเว้นใหม่จะเป็นดังนี้:
interface Throwable |- Exception implements Throwable |- ... |- Error implements Throwable |- TypeError extends Error |- ParseError extends Error |- AssertionError extends Error |- ArithmeticError extends Error |- DivisionByZeroError extends ArithmeticError
ดูส่วนย่อย Throwable Interface ในส่วนการเปลี่ยนแปลงสำหรับข้อมูลเพิ่มเติมเกี่ยวกับลำดับชั้นข้อยกเว้นใหม่นี้
บีซีแตก
ตัวจัดการข้อผิดพลาดแบบกำหนดเองที่ใช้สำหรับการจัดการ (และโดยทั่วไปจะละเว้น) ข้อผิดพลาดร้ายแรงที่กู้คืนได้จะไม่ทำงานอีกต่อไปเนื่องจากข้อยกเว้นจะถูกส่งออกไป
ข้อผิดพลาดในการแยกวิเคราะห์ที่เกิดขึ้นในโค้ด eval()
ed จะกลายเป็นข้อยกเว้น โดยกำหนดให้ต้องรวมไว้ในบล็อก try...catch
RFC: ข้อยกเว้นในเครื่องยนต์
การเปลี่ยนแปลงนี้ส่งผลต่อลำดับชั้นข้อยกเว้นของ PHP เนื่องจากมีการแนะนำข้อยกเว้นในกลไกจัดการ แทนที่จะวางข้อผิดพลาดร้ายแรงและกู้คืนได้ภายใต้ลำดับชั้นคลาส Exception
ที่มีอยู่แล้ว มีการตัดสินใจที่จะใช้ลำดับชั้นใหม่ของข้อยกเว้นเพื่อป้องกันไม่ให้โค้ด PHP 5.x จับข้อยกเว้นใหม่เหล่านี้ด้วย catch-all ( catch (Exception $e)
) ข้อ
ลำดับชั้นข้อยกเว้นใหม่จะเป็นดังนี้:
interface Throwable |- Exception implements Throwable |- ... |- Error implements Throwable |- TypeError extends Error |- ParseError extends Error |- AssertionError extends Error |- ArithmeticError extends Error |- DivisionByZeroError extends ArithmeticError
อินเทอร์เฟซ Throwable
ถูกนำมาใช้โดยทั้งลำดับชั้นของคลาสฐาน Exception
และ Error
และกำหนดสัญญาต่อไปนี้:
interface Throwable { final public string getMessage ( void ) final public mixed getCode ( void ) final public string getFile ( void ) final public int getLine ( void ) final public array getTrace ( void ) final public string getTraceAsString ( void ) public string __toString ( void ) }
Throwable
ไม่สามารถใช้งานได้กับคลาสที่ผู้ใช้กำหนด แต่คลาสข้อยกเว้นแบบกำหนดเองควรขยายหนึ่งในคลาสข้อยกเว้นที่มีอยู่แล้วใน PHP
RFC: อินเทอร์เฟซแบบโยนได้
ความหมายสำหรับพฤติกรรมที่ใช้จำนวนเต็มมีการเปลี่ยนแปลงเพื่อให้ใช้งานง่ายขึ้นและไม่ขึ้นกับแพลตฟอร์ม นี่คือรายการการเปลี่ยนแปลงเหล่านี้:
การโยน NAN
และ INF
เป็นจำนวนเต็มจะให้ผลลัพธ์เป็น 0 เสมอ
ขณะนี้ไม่อนุญาตให้เปลี่ยนบิตตามจำนวนลบของบิต (ทำให้เกิดการส่งคืนบูล (เท็จ) และส่ง E_WARNING)
การเลื่อนระดับบิตไปทางซ้ายตามจำนวนบิตที่เกินความกว้างบิตของจำนวนเต็มจะส่งผลให้เป็น 0 เสมอ
การเลื่อนระดับบิตไปทางขวาตามจำนวนบิตที่เกินความกว้างบิตของจำนวนเต็มจะส่งผลให้เป็น 0 หรือ -1 เสมอ (ขึ้นอยู่กับเครื่องหมาย)
บีซีแตก
การพึ่งพาความหมายแบบเก่าสำหรับสิ่งที่กล่าวมาข้างต้นจะไม่ทำงานอีกต่อไป
RFC: ความหมายจำนวนเต็ม
การให้สิทธิ์ใช้งานส่วนขยาย JSON แบบเก่านั้นถือว่าไม่ฟรี ทำให้เกิดปัญหากับการแจกจ่ายบน Linux จำนวนมาก ส่วนขยายได้ถูกแทนที่ด้วย JSOND และมาพร้อมกับประสิทธิภาพที่เพิ่มขึ้นและความเข้ากันได้แบบย้อนหลังที่เสียหาย
บีซีแตก
ตัวเลข ต้องไม่ ลงท้ายด้วยจุดทศนิยม (เช่น 34.
ต้องเปลี่ยนเป็น 34.0
หรือเพียง 34
)
เลขชี้กำลัง e
จะต้องไม่ ตามจุดทศนิยมทันที (เช่น 3.e3
ต้องเปลี่ยนเป็น 3.0e3
หรือเพียง 3e3
)
RFC: แทนที่ส่วนขยาย json ปัจจุบันด้วย jsond
การบีบบังคับระหว่างจำนวนลอยกับจำนวนเต็มสามารถเกิดขึ้นได้เมื่อมีการส่งค่าจำนวนลอยไปยังฟังก์ชันภายในโดยคาดว่าจะได้จำนวนเต็ม ถ้าทศนิยมมีขนาดใหญ่เกินกว่าจะแสดงเป็นจำนวนเต็ม ค่านั้นจะถูกตัดทอนอย่างเงียบๆ (ซึ่งอาจส่งผลให้สูญเสียขนาดและเครื่องหมาย) สิ่งนี้อาจทำให้เกิดจุดบกพร่องที่หายากได้ การเปลี่ยนแปลงนี้จึงพยายามแจ้งให้นักพัฒนาทราบเมื่อมีการแปลงโดยนัยจากทศนิยมเป็นจำนวนเต็มเกิดขึ้นและล้มเหลวโดยการคืนค่า null
และปล่อย E_WARNING
บีซีแตก
รหัสที่เคยทำงานแบบเงียบๆ จะส่ง E_WARNING ออกมา และอาจล้มเหลวหากผลลัพธ์ของการเรียกใช้ฟังก์ชันถูกส่งผ่านไปยังฟังก์ชันอื่นโดยตรง (เนื่องจากตอนนี้จะส่ง null
เข้ามา)
RFC: ความล้มเหลว ZPP บนโอเวอร์โฟลว์
foreach()
foreach()
ของ PHP มี edge-case แปลกๆ อยู่หลายตัว สิ่งเหล่านี้ขับเคลื่อนโดยการใช้งานและทำให้เกิดพฤติกรรมที่ไม่ได้กำหนดและไม่สอดคล้องกันอย่างมากเมื่อวนซ้ำระหว่างสำเนาและการอ้างอิงของอาร์เรย์ เมื่อใช้ตัวจัดการตัววนซ้ำเช่น current()
และ reset()
เมื่อแก้ไขอาร์เรย์ที่กำลังวนซ้ำอยู่ในปัจจุบัน และอื่นๆ
การเปลี่ยนแปลงนี้จะขจัดพฤติกรรมที่ไม่ได้กำหนดไว้ของ Edge-case เหล่านี้ และทำให้อรรถศาสตร์สามารถคาดเดาได้และใช้งานง่ายยิ่งขึ้น
foreach()
ตามค่าในอาร์เรย์
$array = [1,2,3];$array2 = &$array;foreach($array เป็น $val) { ไม่ได้ตั้งค่า($อาร์เรย์[1]); // แก้ไขอาร์เรย์ที่ถูกวนซ้ำผ่าน echo "{$val} - ", current($array), PHP_EOL; }// ก่อน PHP 7 ผลลัพธ์ 1 - 33 - // PHP 7+ ผลลัพธ์ 1 - 12 - 13 - 1
เมื่อใช้ซีแมนทิกส์ตามค่า อาร์เรย์ที่ถูกวนซ้ำจะไม่ถูกแก้ไขในตำแหน่ง current()
ยังได้กำหนดลักษณะการทำงานไว้ด้วย ซึ่งจะเริ่มต้นที่จุดเริ่มต้นของอาร์เรย์เสมอ
foreach()
โดยการอ้างอิงถึงอาร์เรย์และวัตถุและตามค่าของวัตถุ
$array = [1,2,3];foreach($array as &$val) { echo "{$val} - ", ปัจจุบัน($array), PHP_EOL; }// ก่อน PHP 7 ผลลัพธ์ 1 - 22 - 33 - // PHP 7+ ผลลัพธ์ 1 - 12 - 13 - 1
ฟังก์ชัน current()
จะไม่ได้รับผลกระทบจากการวนซ้ำของ foreach()
บนอาร์เรย์อีกต่อไป นอกจากนี้ Nested foreach()
การใช้ซีแมนทิกส์อ้างอิงยังทำงานแยกจากกันในขณะนี้:
$array = [1,2,3];foreach($array เป็น &$val) { echo $val, PHP_EOL; foreach ($อาร์เรย์เป็น &$val2) { ไม่ได้ตั้งค่า($อาร์เรย์[1]); เสียงสะท้อน $val, PHP_EOL; - }// ก่อน PHP 7 ผลลัพธ์ 111// PHP 7+ ผลลัพธ์ 111333
บีซีแตก
การพึ่งพาซีแมนทิกส์แบบเก่า (ที่แปลกและไม่มีเอกสาร) จะไม่ทำงานอีกต่อไป
RFC: แก้ไขพฤติกรรม "foreach"
list()
ฟังก์ชัน list()
ได้รับการบันทึกไว้ว่าไม่รองรับสตริง อย่างไรก็ตาม ในบางกรณีอาจใช้สตริงได้:
// การยกเลิกการอ้างอิงอาร์เรย์$str[0] = 'ab';list($a, $b) = $str[0];echo $a; // เอโช $b; // b// การอ้างอิงวัตถุ$obj = new StdClass();$obj->prop = 'ab';list($a, $b) = $obj->prop;echo $a; // เอโช $b; // b// ฟังก์ชั่น returnfunction func() { กลับ 'ab'; }list($a, $b) = func();var_dump($a, $b);echo $a; // เอโช $b; //ข
ขณะนี้มีการเปลี่ยนแปลงทำให้การใช้สตริงโดย list()
ถูกห้ามในทุกกรณี
นอกจากนี้ ขณะนี้ list()
กลายเป็นข้อผิดพลาดร้ายแรง และลำดับการกำหนดตัวแปรได้เปลี่ยนไปจากซ้ายไปขวา:
$a = [1, 2];list($a, $b) = $a;// เก่า: $a = 1, $b = 2// ใหม่: $a = 1, $b = null + "ไม่ได้กำหนด ดัชนี 1"$b = [1, 2];list($a, $b) = $b;// เก่า: $a = null + "ดัชนีที่ไม่ได้กำหนด 0", $b = 2// ใหม่: $a = 1, $ข = 2
บีซีแตก
การสร้าง list()
เท่ากับค่าสตริงที่ไม่ใช่โดยตรงไม่สามารถทำได้อีกต่อไป null
จะเป็นค่าสำหรับตัวแปร $a
และ $b
ในตัวอย่างข้างต้น
การเรียกใช้ list()
โดยไม่มีตัวแปรใด ๆ จะทำให้เกิดข้อผิดพลาดร้ายแรง
การพึ่งพาลำดับการมอบหมายจากขวาไปซ้ายแบบเก่าจะไม่ทำงานอีกต่อไป
RFC: แก้ไขรายการ () พฤติกรรมที่ไม่สอดคล้องกัน
RFC: แผนผังไวยากรณ์นามธรรม
ก่อน PHP 7 เมื่อตัวหารเป็น 0 สำหรับตัวดำเนินการหาร (/) หรือโมดูลัส (%) E_WARNING จะถูกปล่อยออกมาและจะส่งกลับค่า false
นี่ไม่ใช่เรื่องสมเหตุสมผลสำหรับการดำเนินการทางคณิตศาสตร์เพื่อส่งคืนบูลีนในบางกรณี ดังนั้นลักษณะการทำงานจึงได้รับการแก้ไขใน PHP 7
ลักษณะการทำงานใหม่ทำให้ตัวดำเนินการหารส่งคืนทศนิยมเป็น +INF, -INF หรือ NAN ตัวดำเนินการโมดูลัส E_WARNING ได้ถูกลบออกแล้ว และ (ควบคู่ไปกับฟังก์ชัน intdiv()
ใหม่) จะส่งข้อยกเว้น DivisionByZeroError
นอกจากนี้ ฟังก์ชัน intdiv()
อาจส่ง ArithmeticError
เมื่อมีการระบุอาร์กิวเมนต์จำนวนเต็มที่ถูกต้องซึ่งทำให้เกิดผลลัพธ์ที่ไม่ถูกต้อง (เนื่องจากจำนวนเต็มล้น)
var_dump(3/0); // ลอย (INF) + E_WARNINGvar_dump (0/0); // ลอย (น่าน) + E_WARNINGvar_dump (0%0); // DivisionByZeroErrorintdiv(PHP_INT_MIN, -1); // เลขคณิตผิดพลาด
บีซีแตก
ตัวดำเนินการหารจะไม่ส่งคืน false
อีกต่อไป (ซึ่งอาจถูกบังคับให้เป็น 0 โดยไม่โต้ตอบในการดำเนินการทางคณิตศาสตร์)
ตัวดำเนินการโมดูลัสจะส่งข้อยกเว้นด้วยตัวหาร 0 แทนที่จะส่งกลับ false
RFC: ไม่มี RFC ที่พร้อมใช้งาน
เมื่อใช้ตัวจัดการเซสชันแบบกำหนดเอง ฟังก์ชันเพรดิเคตจาก SessionHandlerInterface
ที่คาดหวังค่าส่งคืน true
หรือ false
ไม่ทำงานตามที่คาดไว้ เนื่องจากข้อผิดพลาดในการใช้งานครั้งก่อน มีเพียงค่าที่ส่งคืน -1
เท่านั้นที่ถูกพิจารณาว่าเป็นเท็จ ซึ่งหมายความว่าแม้ว่าจะใช้ false
แบบบูลีนเพื่อแสดงถึงความล้มเหลว แต่ก็ถือว่าสำเร็จ:
<?phpclass FileSessionHandler ใช้ SessionHandlerInterface { ส่วนตัว $savePath; ฟังก์ชั่นเปิด($savePath, $sessionName) { กลับเท็จ; //ล้มเหลวเสมอ } ฟังก์ชัน close(){return true;} ฟังก์ชัน read($id){} ฟังก์ชัน write($id, $data){} ฟังก์ชัน destroy($id){} ฟังก์ชัน gc($maxlifetime){} }session_set_save_handler(FileSessionHandler ใหม่());session_start(); // ไม่ทำให้เกิดข้อผิดพลาดในโค้ดก่อน PHP 7
ตอนนี้สิ่งที่กล่าวมาข้างต้นจะล้มเหลวพร้อมกับข้อผิดพลาดร้ายแรง การมีค่าส่งคืน -1
จะยังคงล้มเหลวต่อไป ในขณะที่ 0
และ true
จะยังคงหมายถึงความสำเร็จ ค่าอื่นๆ ที่ส่งคืนจะทำให้เกิดความล้มเหลวและส่ง E_WARNING
บีซีแตก
หากส่งคืนค่า Boolean false
ก็จะล้มเหลวทันที
หากมีการส่งคืนสิ่งอื่นที่ไม่ใช่บูลีน 0
หรือ -1
มันจะล้มเหลวและทำให้เกิดคำเตือน
RFC: แก้ไขการจัดการค่าส่งคืนตัวจัดการเซสชันแบบกำหนดเอง
ตัวสร้าง PHP 4 ได้รับการเก็บรักษาไว้ใน PHP 5 ควบคู่ไปกับ __construct()
ใหม่ ตอนนี้คอนสตรัคเตอร์สไตล์ PHP 4 กำลังเลิกใช้แล้วเนื่องจากมีเมธอดเดียว ( __construct()
) ที่จะเรียกใช้ในการสร้างออบเจ็กต์ เนื่องจากเงื่อนไขว่าตัวสร้างสไตล์ PHP 4 ถูกเรียกใช้หรือไม่ ทำให้เกิดค่าใช้จ่ายด้านการรับรู้เพิ่มเติมสำหรับนักพัฒนา ซึ่งอาจทำให้ผู้ที่ไม่มีประสบการณ์สับสนได้เช่นกัน
ตัวอย่างเช่น หากคลาสถูกกำหนดไว้ภายในเนมสเปซ หรือมีเมธอด __construct()
อยู่แล้ว ตัวสร้างสไตล์ PHP 4 ก็จะถูกรับรู้ว่าเป็นเมธอดธรรมดา หากถูกกำหนดไว้เหนือวิธี __construct()
ดังนั้นการแจ้งเตือน E_STRICT จะถูกส่งออกมา แต่ยังคงได้รับการยอมรับว่าเป็นวิธีการธรรมดา
ตอนนี้ใน PHP 7 หากคลาสไม่ได้อยู่ในเนมสเปซและไม่มีวิธี __construct()
ตัวสร้างสไตล์ PHP 4 จะถูกนำมาใช้เป็นตัวสร้าง แต่ E_DEPRECATED จะถูกปล่อยออกมา ใน PHP 8 ตัวสร้างสไตล์ PHP 4 จะได้รับการยอมรับว่าเป็นวิธีการธรรมดาเสมอ และการแจ้งเตือน E_DEPRECATED จะหายไป
บีซีแตก
ตัวจัดการข้อผิดพลาดแบบกำหนดเองอาจได้รับผลกระทบจากการเพิ่มคำเตือน E_DEPRECATED หากต้องการแก้ไขปัญหานี้ เพียงอัปเดตชื่อตัวสร้างคลาสเป็น __construct
RFC: ลบตัวสร้าง PHP 4
เมื่อมีการเรียกใช้ฟังก์ชันตามวันที่หรือเวลาและไม่ได้ตั้งค่าเขตเวลาเริ่มต้น จะมีการส่งคำเตือนออกมา การแก้ไขคือเพียงแค่ตั้งค่า date.timezone
INI ให้เป็นเขตเวลาที่ถูกต้อง แต่สิ่งนี้บังคับให้ผู้ใช้ต้องมีไฟล์ php.ini และกำหนดค่าไว้ล่วงหน้า เนื่องจากนี่เป็นการตั้งค่าเดียวที่มีคำเตือนแนบอยู่ และยังคงมีค่าเริ่มต้นเป็น UTC คำเตือนจึงถูกลบออกแล้ว
RFC: ลบคำเตือน date.timezone
แท็ก PHP ทางเลือก <%
(และ <%=
), %>
, <script language="php">
และ </script>
ได้ถูกลบออกไปแล้ว
บีซีแตก
โค้ดที่ใช้แท็กทางเลือกเหล่านี้จำเป็นต้องได้รับการอัปเดตเป็นแท็กเปิดและปิดแบบปกติหรือแบบสั้น ซึ่งสามารถทำได้ด้วยตนเองหรือโดยอัตโนมัติด้วยสคริปต์การย้ายนี้
RFC: ลบแท็ก PHP ทางเลือก
ก่อนหน้านี้ มีความเป็นไปได้ที่จะระบุคำสั่งบล็อก default
หลายรายการภายในคำสั่ง switch (โดยที่บล็อก default
สุดท้ายถูกดำเนินการเท่านั้น) ความสามารถ (ไร้ประโยชน์) นี้ได้ถูกลบออกไปแล้วและทำให้เกิดข้อผิดพลาดร้ายแรง
บีซีแตก
โค้ดใดๆ ที่เขียน (หรือมีแนวโน้มว่าจะสร้างขึ้น) ที่สร้างคำสั่ง switch โดยมีบล็อก default
ต้นหลายบล็อก จะกลายเป็นข้อผิดพลาดร้ายแรง
RFC: ทำให้การกำหนดกรณีเริ่มต้นหลายกรณีในสวิตช์เป็นข้อผิดพลาดทางไวยากรณ์
ก่อนหน้านี้ คุณสามารถระบุพารามิเตอร์ที่มีชื่อซ้ำกันภายในคำจำกัดความของฟังก์ชันได้ ความสามารถนี้ได้ถูกลบออกแล้วและทำให้เกิดข้อผิดพลาดร้ายแรง
ฟังก์ชั่น foo($เวอร์ชัน, $เวอร์ชัน) { คืนเวอร์ชัน $; }echo foo(5, 7);// ผลลัพธ์ PHP 7 ล่วงหน้า 7// ผลลัพธ์ PHP 7+ ข้อผิดพลาดร้ายแรง: คำจำกัดความใหม่ของพารามิเตอร์ $version ใน /redefinition-of-parameters.php
บีซีแตก
พารามิเตอร์ฟังก์ชันที่มีชื่อซ้ำกันจะกลายเป็นข้อผิดพลาดร้ายแรง
SAPI ต่อไปนี้ได้ถูกลบออกจากคอร์แล้ว (ส่วนใหญ่ถูกย้ายไปยัง PECL):
ซาปิ/aolserver
ซาปิ/apache
ซาปิ/apache_hooks
ซาปิ/apache2filter
ซาปี/แคเดียม
ซาปิ/ความต่อเนื่อง
ซาปิ/อิซาปิ
ซาปิ/มิลเตอร์
ซาปิ/นสปี
ซาปิ/phttpd
ซาปิ/pi3web
ซาปิ/ร็อกเซน
ซาปิ/thttpd
ซาปิ/ทักซ์
ซาปิ/เว็บเจมส์
ต่อ/mssql
ต่อ/mysql
ต่อ/sybase_ct
ต่อ/ereg
RFC: การลบ SAPI และส่วนขยายที่พอร์ต PHP7 ที่ตายแล้วหรือยังไม่ได้ออก
เลขฐานสิบหก Stringy ไม่ได้รับการยอมรับว่าเป็นตัวเลขอีกต่อไป
var_dump(is_numeric('0x123'));var_dump('0x123' == '291');echo '0x123' + '0x123';// ก่อน PHP 7 resultbool(true)bool(true)582// PHP 7+ resultbool(เท็จ)บูล(false)0
เหตุผลของการเปลี่ยนแปลงนี้คือ เพื่อส่งเสริมความสอดคล้องที่ดีขึ้นระหว่างการจัดการเลขฐานสิบหกที่เป็นสตริงในภาษาต่างๆ ตัวอย่างเช่น การแคสต์ที่ชัดเจนไม่รู้จักเลขฐานสิบหกที่เป็นสตริง:
var_dump((int) '0x123'); // int(0)
แต่ควรตรวจสอบความถูกต้องและแปลงเลขฐานสิบหกแบบสตริงโดยใช้ฟังก์ชัน filter_var()
ดังนี้
var_dump(filter_var('0x123', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX)); // int(291)
บีซีแตก
การเปลี่ยนแปลงนี้ส่งผลต่อฟังก์ชัน is_numeric()
และตัวดำเนินการต่างๆ รวมถึง ==
, +
, -
, *
, /
, %
, **
, ++
และ --
RFC: ลบการสนับสนุนฐานสิบหกในสตริงตัวเลข
ฟังก์ชันการทำงานที่เลิกใช้งานทั้งหมดได้ถูกลบออกแล้ว โดยเฉพาะอย่างยิ่ง:
ส่วนขยาย mysql ดั้งเดิม (ext/mysql)
ส่วนขยาย ereg (ext/ereg)
การกำหนด new
โดยการอ้างอิง
การเรียกเมธอดที่ไม่คงที่ตามขอบเขตจากบริบท $this
ที่เข้ากันไม่ได้ (เช่น Foo::bar()
จากภายนอกคลาส โดยที่ bar()
ไม่ใช่เมธอดคงที่)
บีซีแตก
รหัสใด ๆ ที่ทำงานโดยมีคำเตือนการเลิกใช้งานใน PHP 5 จะไม่ทำงานอีกต่อไป (คุณได้รับคำเตือน!)
RFC: ลบฟังก์ชันการทำงานที่เลิกใช้แล้วใน PHP 7
ประกาศ E_STRICT มักเป็นพื้นที่สีเทาเล็กน้อยในความหมาย การเปลี่ยนแปลงนี้จะลบหมวดหมู่ข้อผิดพลาดนี้ออกไปโดยสิ้นเชิง และอย่างใดอย่างหนึ่ง: ลบการแจ้งเตือน E_STRICT เปลี่ยนเป็น E_DEPRECATED หากฟังก์ชันการทำงานจะถูกลบออกในอนาคต เปลี่ยนเป็น E_NOTICE หรือเลื่อนระดับเป็น E_WARNING
บีซีแตก
เนื่องจาก E_STRICT อยู่ในประเภทข้อผิดพลาดที่มีความรุนแรงต่ำสุด ข้อผิดพลาดใดๆ ที่ส่งเสริมกับ E_WARNING อาจทำให้ตัวจัดการข้อผิดพลาดแบบกำหนดเองเสียหาย
RFC: จัดประเภทประกาศ E_STRICT ใหม่
password_hash()
ด้วยการเปิดตัว API การแฮชรหัสผ่านใหม่ใน PHP 5.5 หลายคนเริ่มนำไปใช้และสร้างเกลือของตนเอง น่าเสียดายที่เกลือเหล่านี้จำนวนมากถูกสร้างขึ้นจากฟังก์ชันที่ไม่ปลอดภัยในการเข้ารหัสเช่น mt_rand() ซึ่งทำให้เกลืออ่อนกว่าที่ถูกสร้างขึ้นตามค่าเริ่มต้นมาก (ใช่ มีการใช้ Salt เสมอเมื่อแฮชรหัสผ่านด้วย API ใหม่นี้!) ตัวเลือกในการสร้าง Salt จึงเลิกใช้แล้ว เพื่อป้องกันไม่ให้นักพัฒนาสร้าง Salt ที่ไม่ปลอดภัย
RFC: ไม่มี RFC ที่พร้อมใช้งาน
ตัวอักษรฐานแปดที่ไม่ถูกต้องจะทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์ แทนที่จะถูกตัดทอนและเพิกเฉยอย่างเงียบๆ
เสียงสะท้อน 0678; // ข้อผิดพลาดในการแยกวิเคราะห์: ตัวอักษรตัวเลขไม่ถูกต้องใน...
บีซีแตก
ตัวอักษรฐานแปดที่ไม่ถูกต้องในโค้ดจะทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์
RFC: ไม่มี RFC ที่พร้อมใช้งาน
substr()
เปลี่ยนค่าส่งคืน substr()
จะส่งกลับสตริงว่างแทนที่จะเป็น false
เมื่อตำแหน่งเริ่มต้นของการตัดทอนเท่ากับความยาวของสตริง:
var_dump(substr('a', 1));// ก่อน PHP 7 resultbool(false)// PHP 7+ สตริงผลลัพธ์ (0) ""
อย่างไรก็ตาม substr()
อาจยังคงส่งคืนค่า false
ในกรณีอื่น
บีซีแตก
รหัสที่ตรวจสอบอย่างเคร่งครัดสำหรับค่าส่งคืน bool(false)
อาจไม่ถูกต้องตามความหมาย
RFC: ไม่มี RFC ที่พร้อมใช้งาน
PHP 6 เป็นเวอร์ชัน PHP หลักที่ไม่เคยมีมาก่อน มันควรจะรองรับ Unicode อย่างเต็มที่ในแกนหลัก แต่ความพยายามนี้ทะเยอทะยานเกินไปและเกิดภาวะแทรกซ้อนมากเกินไป สาเหตุหลักที่ทำให้เวอร์ชัน 6 ถูกข้ามไปสำหรับเวอร์ชันหลักใหม่นี้มีดังนี้:
เพื่อป้องกันความสับสน แหล่งข้อมูลจำนวนมากเขียนเกี่ยวกับ PHP 6 และชุมชนส่วนใหญ่รู้ว่ามีอะไรนำเสนอบ้าง PHP 7 เป็นสัตว์ร้ายที่แตกต่างไปจากเดิมอย่างสิ้นเชิงโดยมีการมุ่งเน้นที่แตกต่างกันอย่างสิ้นเชิง (โดยเฉพาะด้านประสิทธิภาพ) และชุดคุณสมบัติที่แตกต่างกันโดยสิ้นเชิง ดังนั้นจึงมีการข้ามเวอร์ชันหนึ่งไปเพื่อป้องกันความสับสนหรือความเข้าใจผิดเกี่ยวกับ PHP 7
เพื่อให้สุนัขนอนหลับโกหก PHP 6 ถูกมองว่าล้มเหลว และโค้ด PHP 6 จำนวนมากยังคงอยู่ในที่เก็บ PHP ดังนั้นจึงถูกมองว่าดีที่สุดที่จะเลื่อนผ่านเวอร์ชัน 6 และเริ่มต้นใหม่ในเวอร์ชันหลักถัดไป
RFC: ชื่อของ PHP รุ่นถัดไป