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