2024 年日本 PHP 研討會

向下不相容的變更

PHP 核心

Heredoc/Nowdoc 結束標籤的詮釋

由於引入了彈性的 heredoc/nowdoc 語法,文件字串中包含結束標籤可能會導致語法錯誤或詮釋的變更。例如:

<?php
$str
= <<<FOO
abcdefg
FOO
FOO;
?>
縮排的 FOO 出現以往沒有任何特殊含義。現在它會被解釋為 heredoc 字串的結尾,而後面的 FOO; 會導致語法錯誤。這個問題可以透過選擇一個在字串內容中沒有出現的結束標籤來解決。

針對 switch 的 continue 陳述式問題警告

針對 switch 控制流程結構的 continue 陳述式現在會產生警告。在 PHP 中,這樣的 continue 陳述式等同於 break,而它們在其他語言中的行為類似於 continue 2

<?php
while ($foo) {
switch (
$bar) {
case
"baz":
continue;
// 警告:針對 switch 的 "continue" 等同於
// "break"。您是否要使用 "continue 2"?
}
}
?>

對 ArrayAccess 的整數字串鍵的嚴格解釋

類型為 $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 進行參數解包

使用非整數鍵的 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 現在將錯誤類型分別回報為 intbool,而不是 integerboolean

傳遞給 compact() 的未定義變數現在將會被回報為一個通知。

getimagesize() 和相關函式現在將 BMP 影像的 MIME 類型回報為 image/bmp 而不是 image/x-ms-bmp,因為前者已在 IANA 註冊(請參閱 » RFC 7903)。

stream_socket_get_name() 現在將返回用括號括起來的 IPv6 位址。例如,將返回 "[::1]:1337" 而不是 "::1:1337"

BCMath 任意精度數學

所有由 BCMath 函式 拋出的警告現在都使用 PHP 的錯誤處理。以前,一些警告會直接寫入 stderr。

bcmul()bcpow() 現在會回傳帶有指定小數位數的數字。以前,回傳的數字可能會省略尾端的小數零。

IMAP、POP3 和 NNTP

rsh/ssh 登入預設為停用。如果您想啟用它們,請使用 imap.enable_insecure_rsh。請注意,IMAP 函式庫在將信箱名稱傳遞給 rsh/ssh 命令之前不會過濾它們,因此在啟用 rsh/ssh 的情況下,將不受信任的資料傳遞給此函式庫是不安全的。

多位元組字串

由於新增了對命名捕獲的支援,使用命名捕獲的 mb_ereg_*() 模式將會有不同的行為。特別是命名捕獲將成為匹配的一部分,並且 mb_ereg_replace() 將會解釋額外的語法。有關更多資訊,請參閱 命名捕獲

MySQL 增強擴充功能

準備好的陳述式現在可以正確地回報帶有小數位數指定符的 DATETIMETIMETIMESTAMP 欄位的小數秒數(例如,使用微秒時為 TIMESTAMP(6))。以前,小數秒部分會從回傳值中直接省略。

MySQL 函式 (PDO_MYSQL)

準備好的陳述式現在可以正確地回報帶有小數位數指定符的 DATETIMETIMETIMESTAMP 欄位的小數秒數(例如,使用微秒時為 TIMESTAMP(6))。以前,小數秒部分會從回傳值中直接省略。請注意,這只會影響在關閉模擬準備的情況下使用 PDO_MYSQL(例如,使用原生準備功能)。使用 PDO::ATTR_EMULATE_PREPARES=true(這是預設值)的連線的陳述式不受已修復錯誤的影響,並且已經從引擎取得正確的小數秒值。

反射

反射 匯出為字串現在分別使用 intbool,而不是 integerboolean

標準 PHP 函式庫 (SPL)

如果 SPL 自動載入器擲出例外,則後續的自動載入器將不會被執行。以前,所有自動載入器都會被執行,並且例外會被鏈結。

SimpleXML

涉及 SimpleXML 物件的數學運算現在會將文字視為 intfloat,以較合適者為準。以前,值會無條件地被視為 int

傳入的 Cookie

從 PHP 7.3.23 開始,基於安全考量,傳入 Cookie 的*名稱*不再進行 URL 解碼。

新增註解

使用者貢獻的註解

此頁面沒有使用者貢獻的註解。
To Top