這個版本帶來了重要的變更,指令 zend.exception_ignore_args 預設設定為 On。
在所有堆疊追蹤中,現在缺少 args 鍵值。
所有 PHP 框架都必須處理這個問題才能回報錯誤和例外。
已為 array_key_exists() 函式新增一個專用的 VM 操作碼,如果可以靜態解析,則可提升此函式的效能。在命名空間程式碼中,這可能需要寫成 \array_key_exists()
或明確匯入該函式。
當以 UTF-8 模式("u"
修飾符)重複呼叫 preg_match() 處理同一個字串(但可能使用不同的偏移量)時,它只會檢查一次 UTF-8 有效性。
zend.exception_ignore_args 是一個新的 INI 指令,用於包含或排除例外所產生堆疊追蹤中的參數。
opcache.preload_user 是一個新的 INI 指令,用於指定預載程式碼執行的使用者帳戶,以避免以 root 身分執行(基於安全考量,不允許以 root 身分執行)。
許多擴充功能已遷移至完全使用 pkg-config 來偵測程式庫依賴關係。一般來說,這意味著不再使用 --with-foo-dir=DIR 或類似選項,而僅使用 --with-foo。自訂程式庫路徑可以透過將其他目錄新增至 PKG_CONFIG_PATH
或透過 FOO_CFLAGS
和 FOO_LIBS
明確指定編譯選項來設定。
以下擴充功能和 SAPI 受到影響
fputcsv()、fgetcsv()、SplFileObject::fputcsv()、SplFileObject::fgetcsv() 和 SplFileObject::setCsvControl() 現在接受空字串作為 $escape
參數,這將停用 PHP 專有的跳脫機制。
str_getcsv() 的行為已作相應調整(以前,空字串與使用預設值相同)。
相應地,SplFileObject::getCsvControl() 現在也可能傳回空字串作為陣列的第三個元素。
在 Unix 系統建置時,filter 擴充功能不再公開 --with-pcre-dir,並且現在在使用 ./configure 時可以可靠地建置為共享模組。
內建 libgd 中的 imagecropauto() 行為已與系統 libgd 同步。
IMG_CROP_DEFAULT
不再退回到 IMG_CROP_SIDES
。
imagecropauto() 的預設 $mode
參數已更改為 IMG_CROP_DEFAULT
;傳遞 -1
現在已被棄用。
imagescale() 現在支援透過將 $new_width
傳遞為 -1
來保持長寬比縮放到固定高度。
已移除對 nsldap 和 umich_ldap 的支援。
所有基於 libxml 的擴充功能現在都需要 libxml 2.7.6 或更新版本。
oniguruma 函式庫不再與 PHP 捆綁在一起,系統上需要安裝 libonig。或者,可以使用 --disable-mbregex 來停用 mbregex 元件。
設定選項 --disable-opcache-file 和 --enable-opcache-file 已移除,取而代之的是 opcache.file_cache INI 指令。
password_hash() 和 password_needs_rehash() 函式現在接受可為空的 字串 和 整數 作為 $algo
參數。
PEAR(包含 PECL)的安裝預設不再啟用。可以使用 --with-pear 選項明確啟用。此選項已被棄用,未來可能會移除。
ReflectionClass、ReflectionFunction、ReflectionMethod、ReflectionObject 和 ReflectionProperty 類別上修飾符常數(IS_ABSTRACT
、IS_DEPRECATED
、IS_EXPLICIT_ABSTRACT
、IS_FINAL
、IS_IMPLICIT_ABSTRACT
、IS_PRIVATE
、IS_PROTECTED
、IS_PUBLIC
和 IS_STATIC
)的數值已變更。
SimpleXMLElement 現在實作了 Countable 介面。
內建的 libsqlite 已移除。現在需要系統 libsqlite3 ≥ 3.7.4 才能建置 SQLite3 擴充套件。現在需要系統 libsqlite3 ≥ 3.5.0 才能建置 PDO_SQLite 擴充套件。
SQLite3、SQLite3Stmt 和 SQLite3Result 的序列化和反序列化現在已被明確禁止。以前,這些類別的實例可以序列化,但反序列化會產生無法使用的物件。
@param
標記現在也可以用於表示 SQL 查詢參數。
內建的 libzip 函式庫已移除。現在需要系統 libzip ≥ 0.11 才能建置 zip 擴充套件。
這個版本帶來了重要的變更,指令 zend.exception_ignore_args 預設設定為 On。
在所有堆疊追蹤中,現在缺少 args 鍵值。
所有 PHP 框架都必須處理這個問題才能回報錯誤和例外。
從 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';
內部/擴充套件注意事項
許多操作碼值在 PHP 7.3 和 7.4 之間有所變更,因此大多數的文件資源在這方面都已過時。您可以在 php-src 的 Zend/zend_vm_opcodes.h 中查看定義。例如,ZEND_ECHO 從 40 變更為 136。
雖然操作碼的變更在許多 PHP 版本中都會發生,但 7.4 的變更相當顯著。