2024 年 PHP Conference Japan

後向不相容的變更

PHP 核心

以陣列樣式存取非陣列

嘗試將 nullboolintfloatresource 類型的值作為陣列使用(例如 $null["key"])現在會產生一個通知。

get_declared_classes() 函式

get_declared_classes() 函式現在不再返回尚未實例化的匿名類別。

fn 關鍵字

fn 現在是一個保留關鍵字。尤其,它不能再用作函式或類別名稱。它仍然可以用作方法或類別常數名稱。

檔案結尾的 <?php 標籤

檔案結尾的 <?php(沒有尾隨換行符)現在將被解釋為 PHP 開啟標籤。以前,它被解釋為一個簡短的開啟標籤,後跟字面量 php,並導致語法錯誤(當 short_open_tag=1 時),或者被解釋為字面量 <?php 字串(當 short_open_tag=0 時)。

串流包裝器

在串流上使用 include/require 時,會以 **STREAM_OPTION_READ_BUFFER** 選項呼叫 streamWrapper::stream_set_option()。自訂串流包裝器實作可能需要實作 streamWrapper::stream_set_option() 方法,以避免警告(始終返回 false 是一個足夠的實作)。

序列化

o 序列化格式已被移除。由於 PHP 從未產生它,這可能只會破壞手動製作的字串的反序列化。

密碼演算法常數

密碼雜湊演算法識別碼現在是可為空的字串,而不是整數。

正確使用 PASSWORD_DEFAULT、PASSWORD_BCRYPT、PASSWORD_ARGON2I 和 PASSWORD_ARGON2ID 常數的應用程式將繼續正常運作。

htmlentities() 函式

如果 htmlentities() 與僅支援基本實體替換的編碼一起使用,現在會引發一個通知(而不是嚴格標準警告),在這種情況下,它等同於 htmlspecialchars()

fread()fwrite() 函式

如果操作失敗,fread()fwrite() 現在將返回 false。以前返回的是空字串或 0。EAGAIN/EWOULDBLOCK 不被視為失敗。

這些函式現在在失敗時也會引發通知,例如嘗試寫入唯讀檔案資源時。

BCMath 任意精度數學

如果傳遞了格式不正確的數字(例如 "32foo"),BCMath 函式現在會發出警告。與以前一樣,該參數將被解釋為零。

CURL

嘗試序列化 CURLFile 類別現在將產生例外。以前,只有在反序列化時才會拋出例外。

使用 CURLPIPE_HTTP1 已被棄用,並且從 cURL 7.62.0 版起不再支援。

curl_version()$version 參數已被棄用。如果傳入任何不等於預設值 CURLVERSION_NOW 的值,則會引發警告並忽略該參數。

日期和時間

DateTimeDateTimeImmutable 實例上呼叫 var_dump() 或類似函式將不再在物件上留下可存取的屬性。

DateInterval 物件的比較(使用 ==< 等)現在將會產生警告並始終返回 false。先前所有 DateInterval 物件都被視為相等,除非它們具有屬性。

Intl (國際化)

idn_to_ascii()idn_to_utf8() 的預設參數值現在是 INTL_IDNA_VARIANT_UTS46,而不是已棄用的 INTL_IDNA_VARIANT_2003

MySQLi

已移除嵌入式伺服器功能。它至少從 PHP 7.0 起就已損壞。

未記載的 mysqli::$stat 屬性已被移除,改用 mysqli::stat()

OpenSSL

openssl_random_pseudo_bytes() 函式現在會在錯誤情況下拋出例外,類似於 random_bytes()。特別是,如果請求的位元組數小於或等於零,則會拋出 Error;如果無法收集到足夠的隨機性,則會拋出 Exception。如果函式沒有拋出例外,則 $crypto_strong 輸出參數保證始終為 true,因此不需要明確檢查它。

正規表示式 (Perl 相容)

當使用 PREG_UNMATCHED_AS_NULL 模式時,尾端不匹配的擷取群組現在也將被設為 null(如果啟用偏移擷取,則為 [null, -1])。這表示 $matches 的大小將始終相同。

PHP 資料物件 (PDO)

嘗試序列化 PDOPDOStatement 實例現在將會產生 Exception,而不是 PDOException,這與其他不支援序列化的內部類別一致。

反射 (Reflection)

如果嘗試序列化反射物件,反射物件現在將會產生例外。反射物件的序列化從未被支援,並且會導致反射物件損壞。現在已明確禁止序列化反射物件。

ReflectionClassConstantReflectionMethodReflectionProperty 等類別常數的值已變更。

標準 PHP 函式庫 (SPL)

ArrayObject 實例上呼叫 get_object_vars() 現在將始終返回 ArrayObject 本身(或其子類別)的屬性。先前,除非指定 ArrayObject::STD_PROP_LIST 旗標,否則它會返回包裝的陣列/物件的值。

其他受影響的操作如下:

(array) 轉型不受影響。它們將繼續返回包裝的陣列或 ArrayObject 屬性,具體取決於是否使用 ArrayObject::STD_PROP_LIST 旗標。

如果傳入零,SplPriorityQueue::setExtractFlags() 將拋出異常。先前,這會在下一個提取操作中產生可恢復的致命錯誤。

ArrayObjectArrayIteratorSplDoublyLinkedListSplObjectStorage 現在除了 Serializable 介面之外,還支援 __serialize()__unserialize() 機制。這表示在舊版 PHP 上建立的序列化有效負載仍然可以反序列化,但 PHP 7.4 建立的新有效負載將無法被舊版理解。

Tokenizer(分詞器)

token_get_all() 現在將針對非預期字元發出 T_BAD_CHARACTER 權杖,而不是在權杖串流中留下空缺。

傳入 Cookies

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

新增註記

使用者貢獻的註記 1 則註記

happydog at kennel17
3 年前
關於:「已移除 o 序列化格式。由於 PHP 從未產生此格式,這可能只會破壞手動製作的字串的反序列化。」

這個小寫 o 序列化格式由 PHP3 使用,但從未由 PHP4 或更高版本產生。不過,基於向後相容 PHP3 的原因,反序列化程式碼仍然能夠辨識它。

然而,根據一些調查,看起來這段程式碼已經失效了大約 15 年,所以雖然這被列為棄用,但在實務上並非如此。

關於此主題,可以參考 Stack Overflow 上這個很棒的答案,其中包含更多詳細資訊:https://stackoverflow.com/questions/65289729/what-was-phps-o-serialization-format-for
To Top