不向后兼容的變更

PHP 內(nèi)核

$GLOBALS 訪問(wèn)限制

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

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

當(dāng)一個(gè)方法使用繼承的(而不是重寫的)靜態(tài)變量時(shí),繼承的方法將與父級(jí)共享這個(gè)靜態(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)在要求重寫方法聲明一個(gè)可兼容的返回類型,否則在繼承時(shí)會(huì)給出方法廢棄的提示。 如果由于 PHP 跨版本兼容性的問(wèn)題,導(dǎo)致不能為重寫方法聲明返回類型,則可以添加 #[ReturnTypeWillChange] 注解來(lái)取消廢棄提示。

新的關(guān)鍵詞

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

Resource 類型遷移為 Object 類型

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

MySQLi

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

常量 MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH 不再生效。

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

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

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

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

MySQLnd

mysqlnd.fetch_data_copy INI 指令已被取消。 這不會(huì)造成用戶可見(jiàn)的變化。

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ù)對(duì)象

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

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

MySQL 驅(qū)動(dòng)

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

SQLite 驅(qū)動(dòng)

現(xiàn)在,結(jié)果集中的整數(shù)及浮點(diǎn)數(shù)將會(huì)以 PHP 原始類型返回。 之前的行為方式可以通過(guò) 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)生一個(gè)空字符串。

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

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

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

SplFixedArray 將會(huì)像 array 類型一樣被 JSON 編碼。