2024 日本 PHP 研討會

其他變更

核心變更

閉包

閉包名稱已調整為包含父函式的名稱和定義行數,以便更容易區分,例如在堆疊追蹤中。

纖程 (Fiber)

現在允許在解構函式執行期間切換纖程。先前由於與垃圾回收的衝突而被阻止。

解構函式現在可以在單獨的纖程中執行

當 Fiber 中的垃圾回收被觸發時,由 GC 呼叫的解構函式會在一個獨立的 Fiber 中執行:gc_destructor_fiber。如果這個 Fiber 暫停,則會建立一個新的 Fiber 來執行剩餘的解構函式。先前的 gc_destructor_fiber 不再被 GC 引用,如果它沒有在其他地方被引用,則可能會被回收。解構函式被暫停的物件將不會被回收,直到解構函式返回或 Fiber 被回收。

輸出處理器

傳遞給 ob_start()flags 參數的輸出處理器狀態旗標現在已被清除。

output_add_rewrite_var() 現在使用 url_rewriter.hosts 而不是 session.trans_sid_hosts 來選擇要重寫的主機。

SAPI 模組的變更

apache2handler

已移除對 EOL Apache 2.0 和 2.2 的支援。現在最低需要的 Apache 版本為 2.4。

CLI

如果指定的檔案找不到,內建伺服器現在會透過遍歷父目錄遞迴搜尋索引檔案。如果路徑看起來像是在參考一個檔案,也就是說,如果最後一個路徑組件包含一個句點,則先前會跳過此程序。在這種情況下,會返回 404 錯誤。現在已將行為更改為在所有情況下都搜尋索引檔案。

FPM

現在可以在沒有主體的情況下成功清空標頭。

狀態頁面新增了一個欄位來顯示記憶體峰值。

Solaris/Illumos 的 /dev/poll events.mechanism 設定已停用。

已變更的函式

核心

trigger_error()user_error() 現在的返回類型為 true 而不是 bool

DOM

DOMDocument::registerNodeClass() 現在的暫定返回類型為 true 而不是 bool。實際上它只能返回 true

雜湊

hash_update() 現在的暫定返回類型為 true 而不是 bool。實際上它只能返回 true

Intl

已新增 NumberFormatter::ROUND_TOWARD_ZERONumberFormatter::ROUND_AWAY_FROM_ZERO 作為 NumberFormatter::ROUND_DOWNNumberFormatter::ROUND_UP 的別名,以便與新的 PHP_ROUND_* 模式保持一致。

ResourceBundle::get() 現在的暫定返回類型為 ResourceBundle|array|string|int|null

idn_to_ascii()idn_to_utf8() 函式現在如果 domain 名稱是空的或太長,都會拋出 ValueError 例外。

idn_to_ascii()idn_to_utf8() 函式現在如果 variant 參數不是 INTL_IDNA_VARIANT_UTS46,都會拋出 ValueError 例外。

LibXML

當傳入非串流上下文資源時,libxml_set_streams_context() 現在會立即拋出 TypeError 例外,而不是在稍後使用串流上下文時才拋出。

MBString

mb_strcut() 對於無效的 UTF-8 和 UTF-16 字串的行為現在更加一致。對於有效的 UTF-8 和 UTF-16 字串,沒有行為上的改變。

ODBC

odbc_fetch_object()odbc_fetch_array()odbc_fetch_into()row 參數現在的預設值為 null,與 odbc_fetch_row() 一致。先前的預設值分別為 -1-10

OpenSSL

openssl_csr_new() 中的 extra_attributes 現在設定的是 CSR 屬性,而不是像之前錯誤設定的主體 DN。

openssl_csr_new() 中的 dn 允許為單個項目設定一個 陣列 的值。

openssl_csr_sign() 新增了 serial_hex 參數,允許以十六進位格式設定序號。

如果使用 OpenSSL 3.2 以下版本,且省略了秒數,則使用 openssl_x509_parse() 解析 ASN.1 UTCTime 會失敗(此類欄位會返回 -1)。OpenSSL 3.3 以上版本已經不載入此類憑證。

PDO

現在可以使用 PDO::getAttribute() 來取得 PDO::ATTR_STRINGIFY_FETCHES 屬性的值。

新增了 PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE,可以用於支援它的驅動程式,透過 PDO::getAttribute() 擷取查詢結果的記憶體使用量。

PDO_FIREBIRD

現在可以使用 PDO::getAttribute() 來取得 FB_ATTR_DATE_FORMATFB_ATTR_TIME_FORMATFB_ATTR_TIMESTAMP_FORMAT 屬性的值。

新增了指定交易隔離層級和存取模式的新屬性。新增了五個與此功能相關的常數:

使用持續連線時,建構函式中現在會進行活躍度檢查。

根據 ibase.hFB_API_VER 的值,所建置的內容會有所不同。現在可以使用新的靜態方法 Pdo\Firebird::getApiVersion() 來獲取此資訊。此資訊現在也會在 phpinfo() 中顯示。

現在可以使用五種新的資料類型:INT128DEC16DEC34TIMESTAMP_TZTIME_TZ。這些類型從 Firebird 4.0 開始提供。

PDO_MYSQL

現在可以使用 PDO::getAttribute() 來獲取 PDO::ATTR_FETCH_TABLE_NAMES 屬性的值。

PDO_PGSQL

支援透過 PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE 擷取查詢的記憶體使用量。

如果欄位的類型為 FLOAT4OIDFLOAT8OID,則現在將以 浮點數 而不是 字串 的形式返回該值。

PGSQL

pg_select()conditions 參數現在是可選的,並且接受空陣列。

Phar

Phar::setAlias()Phar::setDefaultStub() 方法現在的暫定返回類型為 true,而不是 bool

POSIX

當檔案描述符/串流引數無效時,posix_isatty() 現在會設定錯誤號碼。

Reflection (反射)

現在可以在產生器執行完成後呼叫 ReflectionGenerator::getFunction()

Sockets (通訊端)

socket_create_listen()backlog 參數現在的預設值為 SOMAXCONN。先前為 128

Sodium

sodium_crypto_aead_aes256gcm_()* 函數現在可在具有 ARM 加密擴充功能的 aarch64 CPU 上使用。

Standard (標準)

password_hash() 中,PASSWORD_BCRYPT 雜湊演算法的預設 'cost' 值已從 10 增加到 12

debug_zval_dump() 現在會顯示陣列是否已壓縮。

long2ip() 的回傳值類型現在是 字串,而不是 string|false

highlight_string() 的回傳值類型現在是 字串|true,而不是 string|bool

print_r() 的回傳值類型現在是 字串|true,而不是 string|bool

使用 round() 進行四捨五入

round() 函式的 mode 參數已擴展為 RoundingMode|int,可接受新的 RoundingMode 列舉類型的實例。

round() 函式新增了四種新的模式:RoundingMode::PositiveInfinity、RoundingMode::NegativeInfinity、RoundingMode::TowardsZero、RoundingMode::AwayFromZero

將數值四捨五入到整數的內部實作已重寫,以便更容易驗證正確性並更容易維護。由於重寫,一些四捨五入的錯誤已得到修正。例如,以前將 0.49999999999999994 四捨五入到最接近的整數會得到 1.0,而不是正確的結果 0.0。其他輸入值也可能受到影響,並產生與早期 PHP 版本不同的輸出。

修正了由 round() 函式的「預先四捨五入」所造成的錯誤。先前,使用「預先四捨五入」將 0.285(實際上是 0.28499999999999998)之類的值視為小數並將其四捨五入到 0.29。「預先四捨五入」會錯誤地對某些數字進行四捨五入,因此此修正移除了「預先四捨五入」並更改了數字的比較方式,以便將值正確地四捨五入為小數。

round() 可處理的最大精度已擴展一位數。例如,round(4503599627370495.5) 在先前版本中返回 4503599627370495.5,但現在返回 4503599627370496

擴充功能的其他變更

cURL

現在所需的最低 libcurl 版本為 7.61.0。

CURLOPT_DNS_USE_GLOBAL_CACHE 選項不再有任何作用,並且會被靜默忽略。此底層功能在 libcurl 7.11.1 中已被棄用,並在 libcurl 7.62.0 中被移除。

GMP

現在可以將 GMP 物件轉換為 布林值,而不是發出 E_RECOVERABLE_ERROR。轉換行為已重載,因此代表值 0GMP 物件會被轉換為 false

LibXML

現在所需的最低 libxml2 版本為 2.9.4。

Intl

Intl 類別的行為已標準化,在嘗試使用未初始化的物件或複製失敗時,一律會拋出 Error 例外。

MBString

Unicode 資料表已更新至 Unicode 16.0。

MySQLnd

支援 MySQL 9 的新 VECTOR 資料類型。

OpenSSL

現在所需的最低 OpenSSL 版本為 1.1.1。

PDO_PGSQL

現在所需的最低 libpq 版本為 10.0。

PGSQL

現在所需的最低 libpq 版本為 10.0。

SPL

SplFixedArray 中的越界訪問現在會拋出 OutOfBoundsException 類型的異常,而不是 RuntimeException。由於 OutOfBoundsExceptionRuntimeException 的子類別,因此在嘗試捕捉這些異常時不會表現出行為變化。

XSL

現在已宣告型別化屬性 XSLTProcessor::$cloneDocumentXSLTProcessor::$doXInclude

Zlib

現在所需的最低 zlib 版本為 1.2.11。

效能

核心

在高併發負載下,提升了 ZTS 建置中浮點數解析和格式化的效能。這會影響 printf() 系列函數,以及序列化函數,例如 json_encode()serialize()

僅使用 %s%d 指定符的 sprintf() 將會被編譯成等效的字串插值,避免函數呼叫的額外開銷和重複解析格式字串。

BCMath

提升了數字轉換和運算的效能。

DOM

在沒有 xpath 查詢的情況下,DOMNode::C14N() 的效能大幅提升。對於具有數萬個節點的文件,這可以輕鬆地將時間縮短兩個數量級。

提升 XML 序列化的效能並減少記憶體消耗。

減少節點類別的記憶體使用量。

FTP

將大型檔案上傳的 FTP 上傳效能提升高達 10 倍。

雜湊

新增了 SHA-256 的 SSE2 和 SHA-NI 實作。這將在支援的 CPU 上提升效能約 1.3 倍 (SSE2) 和 3 倍到 5 倍 (SHA-NI)。感謝 Colin Percival / Tarsnap 的最佳化。

MBString

mb_strcut() 現在處理 UTF-8 和 UTF-16 字串的速度更快。

查詢 mbstring 編碼名稱的速度現在更快。

將 SJIS-win 轉換為 Unicode 的效能大幅提升。

MySQLnd

提升了 MySQLnd 引號的效能。

PCRE

提升了命名捕獲群組的效能。

隨機數

提升了 Random\Randomizer 的效能,特別著重於 Random\Randomizer::getBytes()Random\Randomizer::getBytesFromString() 方法。

SimpleXML

提升 XML 序列化的效能並減少記憶體消耗。

Standard (標準)

strspn()strcspn() 的效能大幅提升。它們現在以線性時間執行,而不是受限於平方時間。

提升了 strpbrk() 的效能。

get_browser() 現在的速度更快,在某些測試案例中提升了 1.5 倍到 2.5 倍。

新增註釋

使用者提供的註釋

此頁面沒有使用者提供的註釋。
To Top