由於引入了彈性的 heredoc/nowdoc 語法,文件字串中包含結束標籤可能會導致語法錯誤或詮釋的變更。例如:
<?php
$str = <<<FOO
abcdefg
FOO
FOO;
?>
FOO
出現以往沒有任何特殊含義。現在它會被解釋為 heredoc 字串的結尾,而後面的 FOO;
會導致語法錯誤。這個問題可以透過選擇一個在字串內容中沒有出現的結束標籤來解決。
針對 switch
控制流程結構的 continue
陳述式現在會產生警告。在 PHP 中,這樣的 continue
陳述式等同於 break
,而它們在其他語言中的行為類似於 continue 2
。
<?php
while ($foo) {
switch ($bar) {
case "baz":
continue;
// 警告:針對 switch 的 "continue" 等同於
// "break"。您是否要使用 "continue 2"?
}
}
?>
類型為 $obj["123"]
的陣列存取,其中 $obj
實作了 ArrayAccess 且 "123"
是一個整數 字串 字面值,將不再導致隱式轉換為整數,也就是說,會呼叫 $obj->offsetGet("123")
而不是 $obj->offsetGet(123)
。這與非字面值的現有行為相符。陣列的行為不會受到任何影響,它們會繼續將整數字串鍵隱式轉換為整數。
在 PHP 中,靜態屬性在繼承類別之間共用,除非在子類別中明確覆蓋靜態屬性。然而,由於實作的緣故,可以透過賦值參考來分開靜態屬性。這個漏洞已被修復。
<?php
class Test {
public static $x = 0;
}
class Test2 extends Test { }
Test2::$x = &$x;
$x = 1;
var_dump(Test::$x, Test2::$x);
// 之前:int(0), int(1)
// 現在:int(1), int(1)
?>
透過陣列和屬性存取返回的參考現在會在存取過程中解開。這意味著不再可以在存取和使用存取值之間修改參考。
<?php
$arr = [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// 先前:int(4),現在:int(3)
?>
使用非整數鍵的 Traversable 進行參數解包已停止運作。以下程式碼在 PHP 5.6-7.2 中是意外可用的。
<?php
function foo(...$args) {
var_dump($args);
}
function gen() {
yield 1.23 => 123;
}
foo(...gen());
?>
ext_skel 工具已完全重新設計,新增了一些選項,並移除了一些舊選項。現在它以 PHP 撰寫,並且沒有外部依賴項。
已停止支援 BeOS。
在 EH_THROW
模式下,由於警告自動轉換為例外而引發的例外(例如某些 DateTime 例外)不再填入 error_get_last() 狀態。因此,它們現在的工作方式與手動引發的例外相同。
TypeError 現在將錯誤類型分別回報為 int
和 bool
,而不是 integer
和 boolean
。
傳遞給 compact() 的未定義變數現在將會被回報為一個通知。
getimagesize() 和相關函式現在將 BMP 影像的 MIME 類型回報為 image/bmp
而不是 image/x-ms-bmp
,因為前者已在 IANA 註冊(請參閱 » RFC 7903)。
stream_socket_get_name() 現在將返回用括號括起來的 IPv6 位址。例如,將返回 "[::1]:1337"
而不是 "::1:1337"
。
所有由 BCMath 函式 拋出的警告現在都使用 PHP 的錯誤處理。以前,一些警告會直接寫入 stderr。
rsh/ssh 登入預設為停用。如果您想啟用它們,請使用 imap.enable_insecure_rsh。請注意,IMAP 函式庫在將信箱名稱傳遞給 rsh/ssh 命令之前不會過濾它們,因此在啟用 rsh/ssh 的情況下,將不受信任的資料傳遞給此函式庫是不安全的。
由於新增了對命名捕獲的支援,使用命名捕獲的 mb_ereg_*()
模式將會有不同的行為。特別是命名捕獲將成為匹配的一部分,並且 mb_ereg_replace() 將會解釋額外的語法。有關更多資訊,請參閱 命名捕獲。
準備好的陳述式現在可以正確地回報帶有小數位數指定符的 DATETIME
、TIME
和 TIMESTAMP
欄位的小數秒數(例如,使用微秒時為 TIMESTAMP(6)
)。以前,小數秒部分會從回傳值中直接省略。
準備好的陳述式現在可以正確地回報帶有小數位數指定符的 DATETIME
、TIME
和 TIMESTAMP
欄位的小數秒數(例如,使用微秒時為 TIMESTAMP(6)
)。以前,小數秒部分會從回傳值中直接省略。請注意,這只會影響在關閉模擬準備的情況下使用 PDO_MYSQL(例如,使用原生準備功能)。使用 PDO::ATTR_EMULATE_PREPARES
=true
(這是預設值)的連線的陳述式不受已修復錯誤的影響,並且已經從引擎取得正確的小數秒值。
反射 匯出為字串現在分別使用 int
和 bool
,而不是 integer
和 boolean
。
如果 SPL 自動載入器擲出例外,則後續的自動載入器將不會被執行。以前,所有自動載入器都會被執行,並且例外會被鏈結。
從 PHP 7.3.23 開始,基於安全考量,傳入 Cookie 的*名稱*不再進行 URL 解碼。