2024 年 PHP 日本研討會

不相容的變更

PHP 核心

非常接近溢出呼叫堆疊的程式

當使用超過 zend.max_allowed_stack_size-zend.reserved_stack_size 位元組的堆疊時(纖程為 fiber.stack_size-zend.reserved_stack_size),非常接近溢出呼叫堆疊的程式現在可能會拋出 Error

多次執行 proc_get_status()

在 POSIX 系統上,多次執行 proc_get_status() 現在將始終傳回正確的值。先前,只有第一次呼叫該函式才會傳回正確的值。在 proc_get_status() 之後執行 proc_close() 現在也會傳回正確的退出程式碼。先前,這會傳回 -1。在內部,這會透過快取 POSIX 系統上的結果來運作。如果需要先前的行為,則可以檢查 proc_get_status() 傳回的陣列中的 "cached" 鍵,以檢查結果是否已快取。

Zend 最大執行時間計時器

Zend 最大執行時間計時器現在預設為 Linux 上的 ZTS 建置啟用。

具有靜態屬性的 trait 的使用

具有靜態屬性的 trait 的使用現在會重新宣告從父類別繼承的靜態屬性。這會為目前類別建立個別的靜態屬性儲存。這類似於直接將靜態屬性加入類別而不使用 trait。

將負索引指派給空陣列

將負索引 $n 指派給空陣列現在將確保下一個索引為 $n+1 而不是 0

類別常數可見性差異檢查

從介面繼承時,現在會正確檢查類別常數可見性差異。

其鍵對應到自身的 WeakMap 項目

如果鍵不是透過 WeakMap 的迭代可以存取(透過迭代的可存取性被視為弱),則鍵對應到自身(可能透過遞移性)的 WeakMap 項目現在可能會在循環收集期間移除。先前,此類項目永遠不會自動移除。

日期

DateTime 擴充已引入 DateErrorDateException 階層下的日期擴充特定例外與錯誤,而不是警告與一般例外。這改善了錯誤處理,但代價是必須檢查錯誤和例外。

DOM

在沒有父節點的節點上呼叫 DOMChildNode::after()DOMChildNode::before()DOMChildNode::replaceWith() 現在是不執行任何操作,而不是階層例外,這是 DOM 規格要求的行為。

現在可以使用沒有文件的 DOMParentNodeDOMChildNode 方法,而不是拋出 DOM_HIERARCHY_REQUEST_ERR DOMException。這符合 DOM 規格要求的行為。

在沒有指定前置字元的情況下呼叫 DOMDocument::createAttributeNS() 會錯誤地建立預設命名空間,將元素放置在命名空間內,而不是屬性。這個錯誤現在已修正。

當前置字元已用於不同的 URI 時,DOMDocument::createAttributeNS() 先前會錯誤地拋出 DOM_NAMESPACE_ERRNAMESPACE_ERR DOMException。當有前置字元名稱衝突時,現在會正確選擇不同的前置字元。

新的方法和屬性已加入某些 DOM 類別。如果使用者空間類別從這些類別繼承並宣告具有相同名稱的方法或屬性,則宣告必須相容。否則,將拋出有關不相容宣告的典型編譯錯誤。如需新實作的方法和屬性清單,請參閱 新功能清單新函式清單

FFI

傳回型別為 void 的 C 函式現在傳回 null,而不是傳回下列物件 object(FFI\CData:void) { }

Opcache

已移除 opcache.consistency_checks INI 指令。此功能在使用追蹤 JIT 以及繼承快取時已損壞,並且自 PHP 8.1.18 和 PHP 8.2.5 以來已停用,無法啟用。追蹤 JIT 和繼承快取都可能會在腳本持久化之後透過使總和檢查碼失效來修改 shm。嘗試修復跳過了可修改的指標,但由於複雜性而被拒絕。因此,決定移除該功能。

Phar

現在已宣告 Phar 類別常數的類型。

Standard

range() 函式已進行各種變更

  • 當傳遞 objectresourcearray 作為邊界輸入時,現在會拋出 TypeError
  • 當傳遞 0 作為 $step 時,會拋出更詳細的 ValueError
  • 當對遞增範圍使用負 $step 時,現在會拋出 ValueError
  • 如果 $step 是可以解釋為 int 的浮點數,現在就會這樣做。
  • 如果任何引數是無限大或 NAN,現在會拋出 ValueError
  • 如果 $start$end 是空字串,現在會發出 E_WARNING。該值會繼續轉換為值 0
  • 如果 $start$end 的長度超過一個位元組,則僅在它是非數值字串時才會發出 E_WARNING
  • 如果 $start$end 被轉換為整數,因為另一個邊界輸入是數字,則現在會發出 E_WARNING。(例如 range(5, 'z');)。
  • 當嘗試產生字元範圍時,如果 $step 是浮點數,則現在會發出 E_WARNING,除非兩個邊界輸入都是數值字串(例如,range('5', '9', 0.5); 不會產生警告)。
  • 如果其中一個邊界輸入是字串數字,range() 現在會產生字元清單,而不是將另一個輸入轉換為 int(例如 range('9', 'A');)。
<?php
range
('9', 'A'); // 從 PHP 8.3.0 開始,為 ["9", ":", ";", "<", "=", ">", "?", "@", "A"]
range('9', 'A'); // 在 PHP 8.3.0 之前,為 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
?>

number_format() 現在會透過將 $num 四捨五入到小數點前 abs($decimals) 位數來處理負 $decimals 值。先前,負 $decimals 值會被忽略。

file() 旗標錯誤檢查現在會捕捉所有無效旗標。值得注意的是,先前會靜態接受 FILE_APPEND

SNMP

現在已宣告 SNMP 類別常數的類型。

新增筆記

使用者貢獻的筆記

此頁面沒有使用者貢獻的筆記。
To Top