2024 日本 PHP 研討會

其他變更

效能提升

PHP 核心

已為 array_key_exists() 函式新增一個專用的 VM 操作碼,如果可以靜態解析,則可提升此函式的效能。在命名空間程式碼中,這可能需要寫成 \array_key_exists() 或明確匯入該函式。

正規表示式 (Perl 相容)

當以 UTF-8 模式("u" 修飾符)重複呼叫 preg_match() 處理同一個字串(但可能使用不同的偏移量)時,它只會檢查一次 UTF-8 有效性。

INI 檔案處理的變更

zend.exception_ignore_args 是一個新的 INI 指令,用於包含或排除例外所產生堆疊追蹤中的參數。

opcache.preload_user 是一個新的 INI 指令,用於指定預載程式碼執行的使用者帳戶,以避免以 root 身分執行(基於安全考量,不允許以 root 身分執行)。

遷移至 pkg-config

許多擴充功能已遷移至完全使用 pkg-config 來偵測程式庫依賴關係。一般來說,這意味著不再使用 --with-foo-dir=DIR 或類似選項,而僅使用 --with-foo。自訂程式庫路徑可以透過將其他目錄新增至 PKG_CONFIG_PATH 或透過 FOO_CFLAGSFOO_LIBS 明確指定編譯選項來設定。

以下擴充功能和 SAPI 受到影響

  • CURL
    • --with-curl 不再接受目錄參數。
  • Enchant
    • --with-enchant 不再接受目錄參數。
  • FPM
    • --with-fpm-systemd 現在僅使用 pkg-config 進行 libsystem 檢查。libsystemd 的最低版本需求為 209。
  • GD
    • --with-gd 改為 --enable-gd(是否啟用此擴充功能)和 --with-external-gd(選擇使用外部 libgd,而不是內建的)。
    • --with-png-dir 已移除。libpng 為必要套件。
    • --with-zlib-dir 已移除。zlib 為必要套件。
    • --with-freetype-dir 改為 --with-freetype
    • --with-jpeg-dir 改為 --with-jpeg
    • --with-webp-dir 改為 --with-webp
    • --with-xpm-dir 改為 --with-xpm
  • IMAP
    • --with-kerberos-systemd 不再接受目錄參數。
  • Intl
    • --with-icu-dir 已移除。如果傳遞 --enable-intl,則 libicu 一律為必要套件。
  • LDAP
    • --with-ldap-sasl 不再接受目錄參數。
  • Libxml
    • --with-libxml-dir 已移除。
    • --enable-libxml 改為 --with-libxml
    • --with-libexpat-dir 已重新命名為 --with-expat 且不再接受目錄參數。
  • Litespeed
    • --with-litespeed 改為 --enable-litespeed
  • Mbstring
    • --with-onig 已移除。除非已傳遞 --disable-mbregex,否則 libonig 為必要套件。
  • ODBC
    • --with-iodbc 不再接受目錄參數。
    • 若未指定目錄,--with-unixODBC 現在會使用 pkg-config(建議)。對於沒有 libodbc.pc 的舊版本,仍然接受目錄指定。
  • OpenSSL
    • --with-openssl 不再接受目錄指定。
  • PCRE
    • --with-pcre-regex 已移除。現在提供 --with-external-pcre 來選擇使用外部 PCRE 函式庫,而不是內建的。
  • PDO_SQLite
    • --with-pdo-sqlite 不再接受目錄指定。
  • Readline
    • --with-libedit 不再接受目錄指定。
  • Sodium
    • --with-sodium 不再接受目錄指定。
  • SQLite3
    • --with-sqlite3 不再接受目錄指定。
  • XSL
    • --with-xsl 不再接受目錄指定。
  • Zip
    • --with-libzip 已移除。
    • --enable-zip 已改為 --with-zip

CSV 跳脫字元

fputcsv()fgetcsv()SplFileObject::fputcsv()SplFileObject::fgetcsv()SplFileObject::setCsvControl() 現在接受空字串作為 $escape 參數,這將停用 PHP 專有的跳脫機制。

str_getcsv() 的行為已作相應調整(以前,空字串與使用預設值相同)。

相應地,SplFileObject::getCsvControl() 現在也可能傳回空字串作為陣列的第三個元素。

資料過濾

在 Unix 系統建置時,filter 擴充功能不再公開 --with-pcre-dir,並且現在在使用 ./configure 時可以可靠地建置為共享模組。

GD

內建 libgd 中的 imagecropauto() 行為已與系統 libgd 同步。

imagecropauto() 的預設 $mode 參數已更改為 IMG_CROP_DEFAULT;傳遞 -1 現在已被棄用。

imagescale() 現在支援透過將 $new_width 傳遞為 -1 來保持長寬比縮放到固定高度。

雜湊訊息摘要框架

hash 擴充功能已無法停用,並且始終是任何 PHP 建置的組成部分,類似於 date 擴充功能。

Intl

intl 擴充功能現在至少需要 ICU 50.1。

ResourceBundle 現在實作 Countable 介面。

輕量級目錄存取協定

已移除對 nsldap 和 umich_ldap 的支援。

Libxml

所有基於 libxml 的擴充功能現在都需要 libxml 2.7.6 或更新版本。

多位元組字串

oniguruma 函式庫不再與 PHP 捆綁在一起,系統上需要安裝 libonig。或者,可以使用 --disable-mbregex 來停用 mbregex 元件。

OPcache

設定選項 --disable-opcache-file--enable-opcache-file 已移除,取而代之的是 opcache.file_cache INI 指令。

密碼雜湊

password_hash()password_needs_rehash() 函式現在接受可為空的 字串整數 作為 $algo 參數。

PEAR

PEAR(包含 PECL)的安裝預設不再啟用。可以使用 --with-pear 選項明確啟用。此選項已被棄用,未來可能會移除。

反射

ReflectionClassReflectionFunctionReflectionMethodReflectionObjectReflectionProperty 類別上修飾符常數(IS_ABSTRACTIS_DEPRECATEDIS_EXPLICIT_ABSTRACTIS_FINALIS_IMPLICIT_ABSTRACTIS_PRIVATEIS_PROTECTEDIS_PUBLICIS_STATIC)的數值已變更。

SimpleXML

SimpleXMLElement 現在實作了 Countable 介面。

SQLite3

內建的 libsqlite 已移除。現在需要系統 libsqlite3 ≥ 3.7.4 才能建置 SQLite3 擴充套件。現在需要系統 libsqlite3 ≥ 3.5.0 才能建置 PDO_SQLite 擴充套件。

SQLite3SQLite3StmtSQLite3Result 的序列化和反序列化現在已被明確禁止。以前,這些類別的實例可以序列化,但反序列化會產生無法使用的物件。

@param 標記現在也可以用於表示 SQL 查詢參數。

Zip

內建的 libzip 函式庫已移除。現在需要系統 libzip ≥ 0.11 才能建置 zip 擴充套件。

新增註解

使用者貢獻的註解 3 則註解

Florent H (Sowapps)
4 年前
這個版本帶來了重要的變更,指令 zend.exception_ignore_args 預設設定為 On。
在所有堆疊追蹤中,現在缺少 args 鍵值。
所有 PHP 框架都必須處理這個問題才能回報錯誤和例外。
ohcc at 163 dot com
4 年前
從 PHP 7.4 開始,使用者自訂的關閉函式中拋出的例外,可以被使用者自訂的例外處理器捕捉。

<?php
set_error_handler
(
function(
$level, $error, $file, $line){
if(
0 === error_reporting()){
return
false;
}
throw new
ErrorException($error, -1, $level, $file, $line);
},
E_ALL
);

register_shutdown_function
(function(){
$error = error_get_last();
if(
$error){
throw new
ErrorException($error['message'], -1, $error['type'], $error['file'], $error['line']);
}
});

set_exception_handler
(function($exception){
// ... 更多程式碼 ...
});

require
'NotExists.php';
santi at mola dot io
4 年前
內部/擴充套件注意事項

許多操作碼值在 PHP 7.3 和 7.4 之間有所變更,因此大多數的文件資源在這方面都已過時。您可以在 php-src 的 Zend/zend_vm_opcodes.h 中查看定義。例如,ZEND_ECHO 從 40 變更為 136。

雖然操作碼的變更在許多 PHP 版本中都會發生,但 7.4 的變更相當顯著。
To Top