現(xiàn)在訪問 $GLOBALS 數(shù)組受到一些限制。
對單個數(shù)組元素的讀寫訪問 $GLOBALS['var']
與之前一樣。
也將繼續(xù)支持對整個數(shù)組 $GLOBALS 的只讀訪問。
但是,不再支持對整個 $GLOBALS 數(shù)組的寫訪問。
例如,array_pop($GLOBALS)
將返回錯誤。
當一個方法使用繼承的(而不是重寫的)靜態(tài)變量時,繼承的方法將與父級共享這個靜態(tài)變量。
<?php
class A {
public static function counter() {
static $counter = 0;
$counter++;
return $counter;
}
}
class B extends A {}
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)
?>
大多數(shù)非 Final 的內(nèi)部方法現(xiàn)在要求重寫方法聲明一個可兼容的返回類型,否則在繼承時會給出方法廢棄的提示。
如果由于 PHP 跨版本兼容性的問題,導致不能為重寫方法聲明返回類型,則可以添加 #[ReturnTypeWillChange]
注解來取消廢棄提示。
現(xiàn)在 readonly
是一個關鍵詞。不過,它仍然可以被用作函數(shù)名。
一些 資源(resource) 類型已被遷移到 object 類型。
要檢查返回值,應該從 is_resource() 檢查是否為資源,更改為檢查返回值是否等于 false
。
現(xiàn)在 FileInfo 函數(shù)接收并返回 finfo 對象類型,
而不是 fileinfo
資源(resource) 類型。
現(xiàn)在 FTP 函數(shù)接收并返回 FTP\Connection 對象類型,
而不是 ftp
資源(resource) 類型。
現(xiàn)在 IMAP 函數(shù)接收并返回 IMAP\Connection 對象類型,
而不是 imap
資源(resource) 類型。
現(xiàn)在 LDAP 函數(shù)接收并返回 LDAP\Connection 對象類型,
而不是 ldap link
資源(resource) 類型。
現(xiàn)在 LDAP 函數(shù)接收并返回 LDAP\Result 對象類型,
而不是 ldap result
資源(resource) 類型。
現(xiàn)在 LDAP 函數(shù)接收并返回 LDAP\ResultEntry 對象類型,
而不是 ldap result entry
資源(resource) 類型。
現(xiàn)在 PgSQL 函數(shù)接收并返回 PgSql\Connection 對象類型,
而不是 pgsql link
資源(resource) 類型。
現(xiàn)在 PgSQL 函數(shù)接收并返回 PgSql\Result 對象類型,
而不是 pgsql result
資源(resource) 類型。
現(xiàn)在 PgSQL 函數(shù)接收并返回 PgSql\Lob 對象類型,
而不是 pgsql large object
資源(resource) 類型。
現(xiàn)在 PSpell 函數(shù)接收并返回 PSpell\Dictionary 對象類型,
而不是 pspell
資源(resource) 類型。
現(xiàn)在 PSpell 函數(shù)接收并返回 PSpell\Config 對象類型,
而不是 pspell config
資源(resource) 類型。
現(xiàn)在 mysqli_fetch_fields() 和
mysqli_fetch_field_direct() 對于 max_length 將返回 0
值。
這一信息可以迭代結果集來計算,并獲取最大長度。這是之前 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
。
默認錯誤處理模式已經(jīng)由 silent 變成了 exceptions,更多詳情及如何設置該屬性請參見 MySQLi reporting mode 。
要恢復之前的行為習慣,請使用:
mysqli_report(MYSQLI_REPORT_OFF);
現(xiàn)在,擴展 mysqli_stmt::execute() 類需要指定額外的可選參數(shù)。
mysqlnd.fetch_data_copy INI 指令已被取消。 這不會造成用戶可見的變化。
現(xiàn)在 EC 私鑰將以 PKCS#8 格式導出,而非像其他秘鑰那樣的傳統(tǒng)格式。
現(xiàn)在 openssl_pkcs7_encrypt() 和 openssl_cms_encrypt() 將默認使用 AES-128-CBC,而非 RC2-40。 RC2-40 加密被認為是不安全的,OpenSSL 3 默認不啟用。
現(xiàn)在 PDO::ATTR_STRINGIFY_FETCHES
的類型從 bool 變成了字符串 "0"
或
"1"
。之前的 bool 類型沒有被字符串化。
現(xiàn)在當 PDO::ATTR_STRINGIFY_FETCHES
被禁用時,
以 PDO::PARAM_LOB
為參數(shù)調(diào)用 PDOStatement::bindColumn() 結果將總是綁定一個流。
以前,結果要么是一個流,要么是一個字符串,這取決于所用的數(shù)據(jù)庫驅(qū)動及其執(zhí)行的時間。
現(xiàn)在,當使用模擬預處理時,結果集中的整數(shù)及浮點數(shù)將會以 PHP 原始類型返回,而不是以 string 類型返回。
這與原生的預處理方式一樣。
之前的行為方式可以通過 PDO::ATTR_STRINGIFY_FETCHES
恢復。
現(xiàn)在,結果集中的整數(shù)及浮點數(shù)將會以 PHP 原始類型返回。
之前的行為方式可以通過 PDO::ATTR_STRINGIFY_FETCHES
恢復。
為了遵守 ArrayAccess 接口, Phar::offsetUnset() 和 PharData::offsetUnset() 不再以 bool 類型返回。
version_compare() 函數(shù)不再接收未經(jīng)記錄的操作符縮寫。
現(xiàn)在 htmlspecialchars()、
htmlentities()、
htmlspecialchars_decode()、
html_entity_decode()、
get_html_translation_table()
使用 ENT_QUOTES | ENT_SUBSTITUTE
作為默認值,而不再是 ENT_COMPAT
。
這意味著 '
被轉義為 '
而不像之前那樣不作處理。
此外,有缺陷的 UTF-8 將被 Unicode 替代字符(substitute character)替換,而不是產(chǎn)生一個空字符串。
現(xiàn)在 debug_zval_dump() 函數(shù)可以打印封裝的引用計數(shù)了,不僅僅只是打印 &
引用計數(shù)的值。
這更準確地模擬了自 PHP 7.0 以來的引用注解。
現(xiàn)在 debug_zval_dump() 可打印 interned
字符串,而不是 interned 字符串和不可變數(shù)組的虛擬的引用計數(shù)。
SplFixedArray 將會像 array 類型一樣被 JSON 編碼。