2024 年 PHP Conference Japan

其他變更

核心變更

FFI

opcache.preload_user 為目前的系統使用者時,現在允許在預載期間呼叫 FFI::load()。先前,如果設定了 opcache.preload_user 指令,則在預載期間無法呼叫 FFI::load()

FPM

若 socket 路徑長度超過作業系統支援的長度,FPM CLI 測試現在會失敗。

Opcache

在 CLI 和 phpdbg SAPI 中,以 root 身份執行時,預載不再需要設定 opcache.preload_user 指令。在其他 SAPI 中,以 root 身份執行時仍需要此指令,因為預載是在 SAPI 切換到非特權使用者之前完成的。

資料流

在 socket 連線上,若有已緩衝的資料,阻塞式的 fread() 會立即返回,而不是等待更多資料。

如果搜尋偏移量超過尾端,記憶體資料流將不再失敗。相反地,記憶體會在下一次寫入時增加,並且舊尾端和偏移量之間的資料會填入零位元組,類似於檔案的運作方式。

file_exists()stat() 訪問操作現在將使用真實路徑而不是實際的資料流路徑。這與資料流開啟一致。

SAPI 模組的變更

CLI

STDOUTSTDERRSTDIN 資料流在資源銷毀時(通常是 CLI 結束時)不再關閉。然而,仍然可以使用 fclose() 等方法明確關閉這些資料流。

已變更的函式

核心

gc_status() 已新增以下 8 個欄位

  • "running" => 布林值
  • "protected" => 布林值
  • "full" => 布林值
  • "buffer_size" => 整數
  • "application_time" => 浮點數:應用程式總執行時間,以秒為單位(包含 collector_time)
  • "collector_time" => 浮點數:收集循環所花費的時間,以秒為單位(包含 destructor_time 和 free_time)
  • "destructor_time" => 浮點數:在循環收集期間執行解構器所花費的時間,以秒為單位
  • "free_time" => 浮點數:在循環收集期間釋放值所花費的時間,以秒為單位

class_alias() 現在支援建立內部類別的別名。

使用 ini_set('open_basedir', ...); 在執行階段設定 open_basedir 不再接受包含父目錄 (..) 的路徑。以前,只禁止以 .. 開頭的路徑。這可以透過在路徑前加上 ./ 輕易規避。

使用者例外處理常式現在會在關閉期間攔截例外。

highlight_string()highlight_file() 的結果 HTML 已變更。外部 HTML 標籤之間的空白會被移除。換行符號和空格不再轉換為 HTML 實體。現在整個 HTML 都包裝在 <pre> 標籤中。外部的 <span> 標籤已與 <code> 標籤合併。

日曆

easter_date() 現在在 64 位元系統上支援 1970 年到 2,000,000,000 年,先前僅支援 1970 年到 2037 年。

Curl

curl_getinfo() 現在支援兩個新的常數:CURLINFO_CAPATHCURLINFO_CAINFO。如果選項為 null,則會出現以下兩個額外的鍵值:"capath""cainfo"

DOM

DOMCharacterData::appendData() 的暫定回傳型別已更改為 true

DOMDocument::loadHTML()DOMDocument::loadHTMLFile()DOMDocument::loadXML() 現在的暫定回傳型別為 bool。先前,文件的回傳型別為 DOMDocument|bool,但從 PHP 8.0.0 開始,DOMDocument 無法回傳,因為它不再是靜態可呼叫的。

Gd

imagerotate() 的簽章已更改。 $ignore_transparent 參數已被移除,因為自 PHP 5.5.0 起它就被忽略了。

Intl

datefmt_set_timezone()(及其別名 IntlDateformatter::setTimeZone())現在在成功時回傳 true,先前回傳 null

IntlBreakiterator::setText() 現在在失敗時回傳 false,先前回傳 null。現在在成功時回傳 true,先前回傳 null

IntlChar::enumCharNames() 現在回傳布林值。先前它在成功時回傳 null,在失敗時回傳 false

IntlDateFormatter::__construct() 在設定了無效的語系時會拋出 U_ILLEGAL_ARGUMENT_ERROR 例外。

MBString

mb_strtolower()mb_convert_case() 為希臘字母 sigma 實作了條件式大小寫規則。對於 mb_convert_case(),條件式大小寫僅適用於 MB_CASE_LOWERMB_CASE_TITLE 模式,不適用於 MB_CASE_LOWER_SIMPLEMB_CASE_TITLE_SIMPLE

mb_decode_mimeheader() 現在會按照 RFC 2047 的要求,將 QPrint 編碼 MIME 編碼字詞中的底線解讀為空格。在這種 MIME 編碼字詞中,底線必須編碼為 "=5F"

在極少數情況下,mb_encode_mimeheader() 會對其輸入字串進行傳輸編碼,而在 PHP 8.2 中,它會將其作為原始 ASCII 傳遞。

mb_encode_mimeheader() 不再於使用 QPrint 編碼輸入字串時捨棄空值位元組 (零)。先前這會導致某些文字編碼(尤其是 UTF-16 和 UTF-32)中的字串被 mb_encode_mimeheader 損壞。

mb_detect_encoding() 的「非嚴格」模式現在會按照文件中所述的行為執行。先前,如果輸入字串的同一個位元組(例如,第一個位元組)在所有候選編碼中都無效,它會傳回 false。更廣泛地說,當看到無效的位元組時,它會從考慮中排除候選編碼,如果同一個輸入位元組排除了所有仍在考慮中的剩餘編碼,它會傳回 false。另一方面,如果除了其中一個之外,所有候選編碼都被排除在考慮之外,它會傳回最後剩下的那一個,而不管在字串的後續部分可能遇到多少編碼錯誤。這與文件中描述的行為不同,文件中說:「如果 strict 設定為 false,則會傳回最接近的匹配編碼。」

mysqli

$constructor_args 參數非空且類別沒有建構函式時,mysqli_fetch_object() 現在會引發 ValueError,而不是 Exception

$read$error 參數都未傳遞時,mysqli_poll() 現在會引發 ValueError

mysqli_field_seek()mysqli_result::field_seek() 現在將傳回型別指定為 true,而不是 bool

ODBC

odbc_autocommit() 現在接受 $enable 參數為 null。傳遞 null 與僅傳遞 1 個參數的行為相同,即指示是否啟用自動提交功能。

PGSQL

$constructor_args 參數非空且類別沒有建構函式時,pg_fetch_object() 現在會引發 ValueError,而不是 Exception

當指定的表格無效時,pg_insert() 現在會引發 ValueError,而不是 E_WARNING

pg_insert()pg_convert() 現在會在欄位的值/類型與 PostgreSQL 的類型不符時,擲出 ValueErrorTypeError,而不是 E_WARNING

pg_fetch_result()pg_field_prtlen()pg_field_is_null()$row 參數現在可以為 null。

隨機數

修改了 mt_srand()srand(),使其不再檢查參數數量來決定是否應該使用隨機種子。傳遞 null 將會產生一個隨機種子,0 將會使用零作為種子。這些函式現在與 Random\Engine\Mt19937::__construct() 的行為一致。

反射

ReflectionClass::getStaticProperties() 的返回類型不再可為 null。

標準

unserialize() 產生的 E_NOTICE 已提升為 E_WARNING

如果輸入包含未使用的位元組,unserialize() 現在會發出一個新的 E_WARNING

array_pad() 現在僅受陣列最大元素數量的限制。之前,一次最多只能添加 1048576 個元素。

在開始標記化時未提供標記的情況下,strtok() 會擲出 E_WARNING

當鹽值生成失敗時,password_hash() 現在會將底層的 Random\RandomException 作為 ValueError$previous Exception 連結起來。

如果使用陣列作為 proc_open()$command 參數,則該陣列現在必須至少包含一個非空元素。否則會擲出 ValueError

如果 $command 陣列是無效命令,proc_open() 現在會返回 false,而不是返回稍後會產生警告的資源物件。在 Windows 上已經是這種情況,但現在如果使用了 posix_spawn 實作(大多數 Linux、BSD 和 MacOS 平台),也會是這種情況。在某些不支援 posix_spawn 的舊平台上,此行為尚未更改。

當陣列中的值無法轉換為 int/float 時,array_sum()array_product() 現在會發出警告。以前,陣列和物件會被忽略,而其他所有值都會被強制轉換為 int。此外,定義了數值轉換的物件(例如 GMP)現在會被轉換,而不是被忽略。

number_format()$decimals 參數現在可以正確處理負整數。使用負值的 $decimals 進行捨入,表示 $num 會在小數點前捨入到 $decimals 個有效數字。以前,負的 $decimals 會被忽略,數字會被捨入到小數點後零位。

strrchr() 新增了一個 $before_needle 參數。它的行為類似於 strstr()stristr() 函式中的對應參數。

對於僅包含未結束引號的最後一個欄位,str_getcsv()fgetcsv() 現在會返回空字串,而不是只包含一個空位元組的字串。

擴充套件的其他變更

核心

bool 類型的值使用 遞增/遞減 運算子(++/--)現在會發出警告。這是因為它目前沒有作用,但將來會像 $bool += 1 一樣運作。

null 類型的值使用 遞減 運算子(--)現在會發出警告。這是因為它目前沒有作用,但將來會像 $null -= 1 一樣運作。

實作 _IS_NUMBER 轉換但沒有覆蓋加法和減法的 do_operator 處理程式的內部物件,現在可以像 $o += 1$o -= 1 一樣遞增和遞減。

DOM

DOM 生命週期機制已重新設計,以便仍然可以擷取隱式移除的節點。以前這會導致例外。

SQLite3

SQLite3 類別現在會丟出 SQLite3Exception(繼承自 Exception),而不是 Exception

SQLite 錯誤碼現在會在例外錯誤碼中傳遞,而不是包含在錯誤訊息中。

INI 檔案處理的變更

  • assert.* INI 設定已被棄用。這包含以下 INI 設定:

    如果設定值等於預設值,則不會發出棄用通知。應該改用 zend.assertions INI 設定。

  • zend.max_allowed_stack_size 是一個新的 INI 指令,用於設定允許的最大堆疊大小。可能的值為 0(偵測程序或執行緒的最大堆疊大小)、-1(無限制)或一個正的位元組數。預設值為 0。當無法偵測程序或執行緒的最大堆疊大小時,會使用已知的系統預設值。將此值設定得太高與停用堆疊大小限制的效果相同。Fiber 使用 fiber.stack_size 作為允許的最大堆疊大小。當程序呼叫堆疊超過 zend.max_allowed_stack_size-zend.reserved_stack_size 位元組時,會拋出 Error,以防止堆疊溢位導致的區段錯誤,目標是使除錯更容易。在涉及內部函數或魔術方法 __toString()__clone()__sleep()__destruct() 的不受控制的遞迴期間,堆疊大小會增加。這與堆疊緩衝區溢位無關,也不是安全功能。

  • zend.reserved_stack_size 是一個新的 INI 指令,用於設定保留的堆疊大小(以位元組為單位)。在檢查堆疊大小時,此值會從最大允許堆疊大小中減去,作為緩衝區。

效能

DOM

遍歷 DOMNodeList 現在使用快取。因此,預設情況下,請求項目不再需要二次時間。

從節點獲取文字內容現在避免了配置,從而提高了效能。

DOMChildNode::remove() 現在以 O(1) 效能運行。

標準

file() 旗標錯誤檢查現在快了約 7%。

SPL

RecursiveDirectoryIterator 現在在遍歷目錄時執行較少的 I/O。

新增註記

使用者貢獻的註記

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