Access to the $GLOBALS array is now subject to
    a number of restrictions.
    Read and write access to individual array elements like
    $GLOBALS['var'] continues to work as-is.
    Read-only access to the entire $GLOBALS array also
    continues to be supported.
    However, write access to the entire $GLOBALS array
    is no longer supported. For example, array_pop($GLOBALS)
    will result in an error.
   
When a method using static variables is inherited (but not overridden), the inherited method will now share static variables with the parent method.
<?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), previously int(1)
var_dump(B::counter()); // int(4), previously int(2)
?>
    Most non-final internal methods now require overriding methods to declare
    a compatible return type, otherwise a deprecated notice is emitted during
    inheritance validation.
    In case the return type cannot be declared for an overriding method due to
    PHP cross-version compatibility concerns,
    a #[ReturnTypeWillChange] attribute can be added to silence
    the deprecation notice.
   
   Several 资源(resource)s have been migrated to objects.
   Return value checks using is_resource() should be replaced with checks for false.
  
     The FileInfo functions now accept and return,
     respectively, finfo objects instead of
     fileinfo 资源(resource)s.
    
     The FTP functions now accept and return,
     respectively, FTP\Connection objects instead of
     ftp 资源(resource)s.
    
     The IMAP functions now accept and return,
     respectively, IMAP\Connection objects instead of
     imap 资源(resource)s.
    
     The LDAP functions now accept and return,
     respectively, LDAP\Connection objects instead of
     ldap link 资源(resource)s.
    
     The LDAP functions now accept and return,
     respectively, LDAP\Result objects instead of
     ldap result 资源(resource)s.
    
     The LDAP functions now accept and return,
     respectively, LDAP\ResultEntry objects instead of
     ldap result entry 资源(resource)s.
    
     The PgSQL functions now accept and return,
     respectively, PgSql\Connection objects instead of
     pgsql link 资源(resource)s.
    
     The PgSQL functions now accept and return,
     respectively, PgSql\Result objects instead of
     pgsql result 资源(resource)s.
    
     The PgSQL functions now accept and return,
     respectively, PgSql\Lob objects instead of
     pgsql large object 资源(resource)s.
    
     The PSpell functions now accept and return,
     respectively, PSpell\Dictionary objects instead of
     pspell 资源(resource)s.
    
     The PSpell functions now accept and return,
     respectively, PSpell\Config objects instead of
     pspell config 资源(resource)s.
    
   mysqli_fetch_fields(), and
   mysqli_fetch_field_direct() will now always return
   0 for the max_length.
   This information can be computed by iterating over the result set,
   and taking the maximum length. This is what PHP was doing
   internally previously.
  
   The MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH
   option no longer has any effect.
  
   The MYSQLI_STORE_RESULT_COPY_DATA
   option no longer has any effect. Passing any value to the
   mode parameter of
   mysqli::store_result() no longer has any effect.
  
   mysqli::connect() now returns true instead of null on success.
  
   The default error handling mode has been changed from "silent" to "exceptions"
   See the MySQLi reporting mode
   page for more details on what this entails,
   and how to explicitly set this attribute.
   To restore the previous behaviour use:
   mysqli_report(MYSQLI_REPORT_OFF);
  
Classes extending mysqli_stmt::execute() are now required to specify the additional mandatory parameter.
The mysqlnd.fetch_data_copy INI directive has been removed. This should not result in user-visible behavior changes.
EC private keys will now be exported in PKCS#8 format rather than traditional format, just like all other keys.
openssl_pkcs7_encrypt() and openssl_cms_encrypt() will now to default using AES-128-CBC rather than RC2-40. The RC2-40 cipher is considered insecure and not enabled by default by OpenSSL 3.
   PDO::ATTR_STRINGIFY_FETCHES now stringifies values
   of type bool to "0" or
   "1". Previously bools were not stringified.
  
   Calling PDOStatement::bindColumn() with
   PDO::PARAM_LOB will now constantly bind a stream
   result when PDO::ATTR_STRINGIFY_FETCHES is not enabled.
   Previously, the result would either be a stream or a string depending on
   the used database driver and the time the binding is performed.
  
    Integers and floats in result sets will now be returned using native
    PHP types instead of strings when using emulated prepared statements.
    This matches the behavior of native prepared statements.
    The previous behaviour can be restored by enabling the
    PDO::ATTR_STRINGIFY_FETCHES option.
   
    Integers and floats in results sets will now be returned using native
    PHP types.
    The previous behaviour can be restored by enabling the
    PDO::ATTR_STRINGIFY_FETCHES option.
   
To comply with the ArrayAccess interface, Phar::offsetUnset() and PharData::offsetUnset() no longer return a bool.
version_compare() no longer accepts undocumented operator abbreviations.
   htmlspecialchars(),
   htmlentities(),
   htmlspecialchars_decode(),
   html_entity_decode(),
   and get_html_translation_table()
   now use ENT_QUOTES | ENT_SUBSTITUTE rather than
   ENT_COMPAT by default.
   This means that ' is escaped to
   ' while previously nothing was done.
   Additionally, malformed UTF-8 will be replaced by a Unicode substitution
   character, instead of resulting in an empty string.
  
   debug_zval_dump() now prints the refcount of a reference
   wrappers with their refcount, instead of only prepending
   & to the value.
   This more accurately models reference representation since PHP 7.0.
  
   debug_zval_dump() now prints interned
   instead of a dummy refcount for interned strings and immutable arrays.
  
SplFixedArray, will now be JSON encoded like an array