不向后兼容的變更

PHP 內(nèi)核

$GLOBALS 訪問限制

現(xiàn)在訪問 $GLOBALS 數(shù)組受到一些限制。 對單個數(shù)組元素的讀寫訪問 $GLOBALS['var'] 與之前一樣。 也將繼續(xù)支持對整個數(shù)組 $GLOBALS 的只讀訪問。 但是,不再支持對整個 $GLOBALS 數(shù)組的寫訪問。 例如,array_pop($GLOBALS) 將返回錯誤。

在繼承的方法中 static 變量的用法

當(dāng)一個方法使用繼承的(而不是重寫的)靜態(tài)變量時,繼承的方法將與父級共享這個靜態(tài)變量。

<?php
class {
    public static function 
counter() {
        static 
$counter 0;
        
$counter++;
        return 
$counter;
    }
}
class 
extends {}
var_dump(A::counter()); // int(1)
var_dump(A::counter()); // int(2)
var_dump(B::counter()); // int(3),之前是 int(1)
var_dump(B::counter()); // int(4),之前是 int(2)
?>
這意味著方法中的靜態(tài)變量現(xiàn)在的使用方式與靜態(tài)屬性一樣。

返回類型與內(nèi)部類的兼容性

大多數(shù)非 Final 的內(nèi)部方法現(xiàn)在要求重寫方法聲明一個可兼容的返回類型,否則在繼承時會給出方法廢棄的提示。 如果由于 PHP 跨版本兼容性的問題,導(dǎo)致不能為重寫方法聲明返回類型,則可以添加 #[ReturnTypeWillChange] 注解來取消廢棄提示。

新的關(guān)鍵詞

現(xiàn)在 readonly 是一個關(guān)鍵詞。不過,它仍然可以被用作函數(shù)名。

Resource 類型遷移為 Object 類型

一些 資源(resource) 類型已被遷移到 object 類型。 要檢查返回值,應(yīng)該從 is_resource() 檢查是否為資源,更改為檢查返回值是否等于 false。

MySQLi

現(xiàn)在 mysqli_fetch_fields()mysqli_fetch_field_direct() 對于 max_length 將返回 0 值。 這一信息可以迭代結(jié)果集來計算,并獲取最大長度。這是之前 PHP 內(nèi)部的做法。

常量 MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH 不再生效。

常量 MYSQLI_STORE_RESULT_COPY_DATA 不再生效。 傳遞給 mysqli::store_result()mode 參數(shù)的所有值不再生效。

現(xiàn)在 mysqli::connect() 成功時返回 true 而不再返回 null。

默認(rèn)錯誤處理模式已經(jīng)由 silent 變成了 exceptions,更多詳情及如何設(shè)置該屬性請參見 MySQLi reporting mode 。 要恢復(fù)之前的行為習(xí)慣,請使用: mysqli_report(MYSQLI_REPORT_OFF);

現(xiàn)在,擴(kuò)展 mysqli_stmt::execute() 類需要指定額外的可選參數(shù)。

MySQLnd

mysqlnd.fetch_data_copy INI 指令已被取消。 這不會造成用戶可見的變化。

OpenSSL

現(xiàn)在 EC 私鑰將以 PKCS#8 格式導(dǎo)出,而非像其他秘鑰那樣的傳統(tǒng)格式。

現(xiàn)在 openssl_pkcs7_encrypt()openssl_cms_encrypt() 將默認(rèn)使用 AES-128-CBC,而非 RC2-40。 RC2-40 加密被認(rèn)為是不安全的,OpenSSL 3 默認(rèn)不啟用。

PHP 數(shù)據(jù)對象

現(xiàn)在 PDO::ATTR_STRINGIFY_FETCHES 的類型從 bool 變成了字符串 "0""1"。之前的 bool 類型沒有被字符串化。

現(xiàn)在當(dāng) PDO::ATTR_STRINGIFY_FETCHES 被禁用時, 以 PDO::PARAM_LOB 為參數(shù)調(diào)用 PDOStatement::bindColumn() 結(jié)果將總是綁定一個流。 以前,結(jié)果要么是一個流,要么是一個字符串,這取決于所用的數(shù)據(jù)庫驅(qū)動及其執(zhí)行的時間。

MySQL 驅(qū)動

現(xiàn)在,當(dāng)使用模擬預(yù)處理時,結(jié)果集中的整數(shù)及浮點(diǎn)數(shù)將會以 PHP 原始類型返回,而不是以 string 類型返回。 這與原生的預(yù)處理方式一樣。 之前的行為方式可以通過 PDO::ATTR_STRINGIFY_FETCHES 恢復(fù)。

SQLite 驅(qū)動

現(xiàn)在,結(jié)果集中的整數(shù)及浮點(diǎn)數(shù)將會以 PHP 原始類型返回。 之前的行為方式可以通過 PDO::ATTR_STRINGIFY_FETCHES 恢復(fù)。

Phar

為了遵守 ArrayAccess 接口, Phar::offsetUnset()PharData::offsetUnset() 不再以 bool 類型返回。

Standard

version_compare() 函數(shù)不再接收未經(jīng)記錄的操作符縮寫。

現(xiàn)在 htmlspecialchars()、 htmlentities()、 htmlspecialchars_decode()、 html_entity_decode()、 get_html_translation_table() 使用 ENT_QUOTES | ENT_SUBSTITUTE 作為默認(rèn)值,而不再是 ENT_COMPAT。 這意味著 ' 被轉(zhuǎn)義為 &#039; 而不像之前那樣不作處理。 此外,有缺陷的 UTF-8 將被 Unicode 替代字符(substitute character)替換,而不是產(chǎn)生一個空字符串。

現(xiàn)在 debug_zval_dump() 函數(shù)可以打印封裝的引用計數(shù)了,不僅僅只是打印 & 引用計數(shù)的值。 這更準(zhǔn)確地模擬了自 PHP 7.0 以來的引用注解。

現(xiàn)在 debug_zval_dump() 可打印 interned 字符串,而不是 interned 字符串和不可變數(shù)組的虛擬的引用計數(shù)。

PHP 標(biāo)準(zhǔn)庫(SPL)

SplFixedArray 將會像 array 類型一樣被 JSON 編碼。