diff --git a/appendices/migration84.xml b/appendices/migration84.xml
new file mode 100644
index 000000000000..df3c0d8b8c66
--- /dev/null
+++ b/appendices/migration84.xml
@@ -0,0 +1,55 @@
+
+
+ Migrating from PHP 8.3.x to PHP 8.4.x
+
+
+ This new minor version brings with it a number of
+ new features and a
+ few incompatibilities
+ that should be tested for before switching PHP versions in production
+ environments.
+
+
+
+ &manual.migration.seealso;
+ 7.1.x,
+ 7.2.x,
+ 7.3.x,
+ 7.4.x,
+ 8.0.x,
+ 8.1.x,
+ 8.2.x,
+ 8.3.x.
+
+
+ &appendices.migration84.new-features;
+ &appendices.migration84.new-classes;
+ &appendices.migration84.new-functions;
+ &appendices.migration84.constants;
+ &appendices.migration84.incompatible;
+ &appendices.migration84.deprecated;
+ &appendices.migration84.removed-extensions;
+ &appendices.migration84.other-changes;
+ &appendices.migration84.windows-support;
+
+
+
diff --git a/appendices/migration84/constants.xml b/appendices/migration84/constants.xml
new file mode 100644
index 000000000000..ca32ecd0ed68
--- /dev/null
+++ b/appendices/migration84/constants.xml
@@ -0,0 +1,322 @@
+
+
+ New Global Constants
+
+
+ Core
+
+
+
+ PHP_OUTPUT_HANDLER_PROCESSED
+
+
+ PHP_SBINDIR
+
+
+
+
+
+ cURL
+
+
+
+ CURL_HTTP_VERSION_3
+
+
+ CURL_HTTP_VERSION_3ONLY
+
+
+ CURL_TCP_KEEPCNT
+
+
+ CURLOPT_PREREQFUNCTION
+
+
+ CURL_PREREQFUNC_OK
+
+
+ CURL_PREREQFUNC_ABORT
+
+
+ CURLOPT_SERVER_RESPONSE_TIMEOUT
+
+
+ CURLOPT_DEBUGFUNCTION
+
+
+ CURLINFO_TEXT
+
+
+ CURLINFO_HEADER_IN
+
+
+ CURLINFO_DATA_IN
+
+
+ CURLINFO_DATA_OUT
+
+
+ CURLINFO_SSL_DATA_OUT
+
+
+ CURLINFO_SSL_DATA_IN
+
+
+ CURLINFO_POSTTRANSFER_TIME_T
+
+
+
+
+
+ Intl
+
+
+
+ PATTERN
+ (IntlDateFormatter)
+
+
+ PROPERTY_IDS_UNARY_OPERATOR
+ (IntlChar)
+
+
+ PROPERTY_ID_COMPAT_MATH_START
+
+
+
+ PROPERTY_ID_COMPAT_MATH_CONTINUE
+
+
+
+
+
+
+ LDAP
+
+
+
+ LDAP_OPT_X_TLS_PROTOCOL_MAX
+
+
+ LDAP_OPT_X_TLS_PROTOCOL_TLS1_3
+
+
+
+
+
+ libxml
+
+
+
+ LIBXML_RECOVER
+
+
+ LIBXML_NO_XXE.
+ This is used together with LIBXML_NOENT
+ when entity substitution should be performed,
+ while disallowing external entity loading.
+ This constant is available as of libxml2 2.13.
+
+
+
+
+
+ MySQLi
+
+
+
+ MYSQLI_TYPE_VECTOR
+
+
+
+
+
+ OpenSSL
+
+
+ X509_PURPOSE_OCSP_HELPER
+ X509_PURPOSE_TIMESTAMP_SIGN
+
+
+
+
+ PCNTL
+
+
+
+ SIGCKPT (DragonFlyBSD only)
+
+
+ SIGCKPTEXIT (DragonFlyBSD only)
+
+
+ WEXITED
+
+
+ WSTOPPED
+
+
+ WNOWAIT
+
+
+ P_ALL
+
+
+ P_PID
+
+
+ P_PGID
+
+
+ P_PIDFD (Linux only)
+
+
+ P_UID (NetBSD/FreeBSD only)
+
+
+ P_GID (NetBSD/FreeBSD only)
+
+
+ P_SID (NetBSD/FreeBSD only)
+
+
+ P_JAILID (FreeBSD only)
+
+
+
+
+
+ PGSQL
+
+
+ PGSQL_TUPLES_CHUNK
+
+
+
+
+ POSIX
+
+
+ POSIX_SC_CHILD_MAX
+ POSIX_SC_CLK_TCK
+
+
+
+
+ Sockets
+
+
+ The following socket options are now defined if they are supported:
+
+
+
+
+ SO_EXCLUSIVEADDRUSE (Windows only)
+
+
+ SOCK_CONN_DGRAM (NetBSD only)
+
+
+ SOCK_DCCP (NetBSD only)
+
+
+ TCP_SYNCNT (Linux only)
+
+
+ SO_EXCLBIND (Solaris/Illumos only)
+
+
+ SO_NOSIGPIPE (macOS and FreeBSD)
+
+
+ SO_LINGER_SEC (macOS only)
+
+
+ IP_PORTRANGE (FreeBSD/NetBSD/OpenBSD only)
+
+
+ IP_PORTRANGE_DEFAULT (FreeBSD/NetBSD/OpenBSD only)
+
+
+ IP_PORTRANGE_HIGH (FreeBSD/NetBSD/OpenBSD only)
+
+
+ IP_PORTRANGE_LOW (FreeBSD/NetBSD/OpenBSD only)
+
+
+ SOCK_NONBLOCK
+
+
+ SOCK_CLOEXEC
+
+
+ SO_BINDTOIFINDEX
+
+
+
+
+
+ Sodium
+
+
+
+ SODIUM_CRYPTO_AEAD_AEGIS128L_KEYBYTES
+
+
+ SODIUM_CRYPTO_AEAD_AEGIS128L_NSECBYTES
+
+
+ SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES
+
+
+ SODIUM_CRYPTO_AEAD_AEGIS128L_ABYTES
+
+
+ SODIUM_CRYPTO_AEAD_AEGIS256_KEYBYTES
+
+
+ SODIUM_CRYPTO_AEAD_AEGIS256_NSECBYTES
+
+
+ SODIUM_CRYPTO_AEAD_AEGIS256_NPUBBYTES
+
+
+ SODIUM_CRYPTO_AEAD_AEGIS256_ABYTES
+
+
+
+
+
+ XML
+
+
+
+ XML_OPTION_PARSE_HUGE
+ which allows parsing large inputs with
+ xml_parse and
+ xml_parse_into_struct.
+
+
+
+
+
+
diff --git a/appendices/migration84/deprecated.xml b/appendices/migration84/deprecated.xml
new file mode 100644
index 000000000000..b814148a037c
--- /dev/null
+++ b/appendices/migration84/deprecated.xml
@@ -0,0 +1,491 @@
+
+
+ Deprecated Features
+
+
+ PHP Core
+
+
+
+ Implicitly nullable parameter
+
+
+ A parameter's type is implicitly widened to accept null
+ if the default value for it is &null;.
+
+
+
+ The following code:
+
+
+
+
+
+ should be converted to:
+
+
+
+
+
+ or
+
+
+
+
+
+
+
+
+ However, if such a parameter declaration is followed by a mandatory
+ parameter:
+
+
+
+
+
+ It must be converted to:
+
+
+
+
+
+ or
+
+
+
+
+
+ as optional parameter before required ones are deprecated.
+
+
+
+
+
+ Raising zero to the power of negative number
+
+
+ Raising a number to the power of a negative number is equivalent to taking
+ the reciprocal of the number raised to the positive opposite of the power.
+ Therefore raising 0 to the power of a negative number
+ corresponds to dividing by 0.
+ Thus, this behaviour has been deprecated.
+
+
+
+ This affects the exponentiation operator **
+ and the pow.
+
+
+
+ If the IEEE 754 semantics are desired one should use the new
+ fpow function.
+
+
+
+
+
+ Using underscore _ as class name
+
+
+ Naming a class _ is now deprecated:
+
+
+
+
+
+
+
+
+
+ Classes whose names start with an underscore are not
+ deprecated:
+
+
+
+
+
+
+
+
+
+
+
+
+ Using trigger_error with
+ E_USER_ERROR
+
+
+
+ Calling trigger_error with
+ error_level being equal to
+ E_USER_ERROR is now deprecated.
+
+
+
+ Such usages should be replaced by either throwing an exception,
+ or calling exit, whichever is more appropriate.
+
+
+
+
+
+
+ The E_STRICT constant
+
+
+
+ Because the E_STRICT error level was removed,
+ this constant is now deprecated.
+
+
+
+
+
+ cURL
+
+
+ The CURLOPT_BINARYTRANSFER constant is now deprecated.
+
+
+
+
+ Date
+
+
+ The DatePeriod::__construct(string $isostr, int $options = 0)
+ signature has been deprecated.
+ Use DatePeriod::createFromISO8601String instead.
+
+
+
+
+ The SUNFUNCS_RET_TIMESTAMP,
+ SUNFUNCS_RET_STRING,
+ and SUNFUNCS_RET_DOUBLE constants are now deprecated.
+ This follows from the deprecation of the date_sunset and
+ date_sunrise functions in PHP 8.1.0.
+
+
+
+
+ DBA
+
+
+
+ Passing &null; or &false; to dba_key_split is now
+ deprecated.
+ It would always return &false; in those cases.
+
+
+
+
+ DOM
+
+
+
+ The DOM_PHP_ERR constant is now deprecated.
+
+
+
+
+ The following properties have been formally deprecated:
+
+ DOMDocument::$actualEncoding
+ DOMDocument::$config
+ DOMEntity::$actualEncoding
+ DOMEntity::$encoding
+ DOMEntity::$version
+
+
+
+
+
+ Hash
+
+
+
+ Passing invalid options to hash functions is now deprecated.
+
+
+
+
+ Intl
+
+
+ Calling intlcal_set or
+ IntlCalendar::set
+ with more than two arguments is deprecated.
+ Use either IntlCalendar::setDate or
+ IntlCalendar::setDateTime instead.
+
+
+
+ Calling intlgregcal_create_instance or
+ IntlGregorianCalendar::__construct
+ with more than two arguments is deprecated.
+ Use either IntlGregorianCalendar::createFromDate or
+ IntlGregorianCalendar::createFromDateTime instead.
+
+
+
+
+ LDAP
+
+
+ Calling ldap_connect
+ with more than two arguments is deprecated.
+ Use ldap_connect_wallet instead.
+
+
+
+ Calling ldap_exop
+ with more than four arguments is deprecated.
+ Use ldap_exop_sync instead.
+
+
+
+
+ MySQLi
+
+
+
+ The mysqli_ping function and
+ mysqli::ping method
+ are now deprecated as the reconnect feature was removed in PHP 8.2.0.
+
+
+
+
+ The mysqli_kill function and
+ mysqli::kill method
+ are now deprecated.
+ If this functionality is needed a SQL KILL command
+ can be used instead.
+
+
+
+
+ The mysqli_refresh function and
+ mysqli::refresh method
+ are now deprecated.
+ If this functionality is needed a SQL FLUSH command
+ can be used instead.
+ All All MYSQLI_REFRESH_*
+ constants have been deprecated as well.
+
+
+
+
+ Passing the mode parameter to
+ mysqli_store_result explicitly has been deprecated.
+ As the MYSQLI_STORE_RESULT_COPY_DATA constant was
+ only used in conjunction with this function it has also been deprecated.
+
+
+
+
+ PDO_PGSQL
+
+
+ Using escaped question marks (??) inside
+ dollar-quoted strings is deprecated.
+ Because PDO_PGSQL now has its own SQL parser with dollar-quoted strings
+ support, it is no longer necessary to escape question marks inside them.
+
+
+
+
+ PGSQL
+
+
+ The 2 arguments signature of pg_fetch_result,
+ pg_field_prtlen, and
+ pg_field_is_null is now deprecated.
+ Use the 3 arguments signature with row set to
+ &null; instead.
+
+
+
+
+ Random
+
+
+
+ lcg_value is now deprecated,
+ as the function is broken in multiple ways.
+ Use \Random\Randomizer::getFloat instead.
+
+
+
+
+ Reflection
+
+
+ Calling ReflectionMethod::__construct
+ with one arguments is deprecated.
+ Use ReflectionMethod::createFromMethodName instead.
+
+
+
+
+ Session
+
+
+ Calling session_set_save_handler
+ with more than two arguments is deprecated.
+ Use the two arguments signature instead.
+
+
+
+
+ Changing the value of the
+ session.sid_length and
+ session.sid_bits_per_character
+ INI settings is deprecated.
+ Update the session storage backend to accept 32 character hexadecimal
+ session IDs and stop changing these two INI settings instead.
+
+
+
+
+ Changing the value of the
+ session.use_only_cookies,
+ session.use_trans_sid,
+ session.trans_sid_tags,
+ session.trans_sid_hosts, and
+ session.referer_check
+ INI settings is deprecated.
+ The SID constant is also deprecated.
+
+
+
+
+ SOAP
+
+
+
+ Passing an int to
+ SoapServer::addFunction is now deprecated.
+ If all PHP functions need to be provided flatten the array returned by
+ get_defined_functions.
+
+
+
+
+ The SOAP_FUNCTIONS_ALL constant is now deprecated.
+
+
+
+
+ SPL
+
+
+ The SplFixedArray::__wakeup method is now
+ deprecated, as it implements
+ SplFixedArray::__serialize and
+ SplFixedArray::__unserialize
+ which need to be overwritten instead.
+
+
+
+
+ Using the default value for the escape parameter for the
+ SplFileObject::setCsvControl,
+ SplFileObject::fputcsv, and
+ SplFileObject::fgetcsv is now deprecated.
+
+ It must be passed explicitly either positionally or via named arguments.
+ This does not apply to SplFileObject::fputcsv
+ and SplFileObject::fgetcsv if
+ SplFileObject::setCsvControl was used to set a
+ new default value.
+
+
+
+
+ Standard
+
+
+ Calling stream_context_set_option
+ with two arguments is deprecated.
+ Use stream_context_set_options instead.
+
+
+
+
+ Unserializing strings using the uppercase S tag
+ with unserialize is deprecated.
+
+
+
+
+ Using the default value for the escape parameter for the
+ fputcsv,
+ fgetcsv, and
+ str_getcsv is now deprecated.
+
+ It must be passed explicitly either positionally or via named arguments.
+
+
+
+
+ XML
+
+
+
+ The xml_set_object function has been deprecated.
+
+
+
+
+ Passing non-callable strings to the
+ xml_set_*
+ functions is now deprecated.
+
+
+
+
+
diff --git a/appendices/migration84/incompatible.xml b/appendices/migration84/incompatible.xml
new file mode 100644
index 000000000000..4c5521421d8d
--- /dev/null
+++ b/appendices/migration84/incompatible.xml
@@ -0,0 +1,841 @@
+
+
+ Backward Incompatible Changes
+
+
+ Although not explicitly stated in this section,
+ every new function,
+ class, interface, enum,
+ or constant
+ may cause a redeclaration Error to be thrown.
+
+
+
+ PHP Core
+
+
+
+ exit behavioral change
+
+
+ The exit (and die) language
+ constructs now behave more like a function.
+ This means that they can now be passed like callables,
+
+ are affected by the strict_types declare statement,
+ and now perform the usual type coercions instead of casting any non-integer
+ value to a string.
+
+
+
+ As such, passing invalid types to exit and
+ die now consistently result in a
+ TypeError being thrown.
+
+
+
+
+ Recursion during comparison
+
+
+ Encountering recursion during comparison now results in an
+ Error exception instead of a
+ E_ERROR fatal error.
+
+
+
+
+ Indirect Modification of readonly Properties
+
+
+
+ Indirect modification of readonly properties within __clone()
+ is no longer allowed, e.g. $ref = &$this->readonly.
+ This was already forbidden for readonly initialization, and was an
+ oversight in the "readonly reinitialization during cloning" implementation.
+
+
+
+
+ Type Change of Constants
+
+
+ The PHP_DEBUG and PHP_ZTS
+ constants are now of type bool.
+ Previously they were of type int.
+
+
+
+
+ Temporary Filename Length
+
+
+ The name of uploaded files and files created by the
+ tempnam function are now 13 bytes longer.
+ The total length is still platform-dependent.
+
+
+
+
+
+ Removal of E_STRICT error level
+
+
+ The E_STRICT error level has been removed,
+ as it was no longer in use within the PHP engine.
+ The E_STRICT has also been deprecated.
+
+
+
+
+
+ Extension Class Constants which are now Typed
+
+
+ The following extension class constants now declare a type on their
+ constants:
+
+ Date
+ Intl
+ PDO
+ Reflection
+ SPL
+ Sqlite
+ XMLReader
+
+
+
+
+
+
+ Resource to Object Migration
+
+
+ Several &resource;s have been migrated to &object;s.
+ Return value checks using is_resource should be
+ replaced with checks for &false;, unless specified otherwise.
+
+
+
+ DBA
+
+
+ The DBA functions now accept and return
+ Dba\Connection objects instead of
+ dba_connection &resource;s.
+
+
+
+
+ ODBC
+
+
+ The ODBC functions now accept and return
+ Odbc\Result objects instead of
+ odbc_result &resource;s.
+
+
+
+ The ODBC functions now accept and return
+ Odbc\Connection objects instead of
+ odbc_connection &resource;s.
+
+
+
+
+ SOAP
+
+
+ The SoapClient::$httpurl property is now a
+ Soap\Url object rather than a
+ soap_url &resource;.
+ Checks using is_resource (i.e.
+ is_resource($client->httpurl)) should be replaced with checks
+ for &null; (i.e. $client->httpurl !== null).
+
+
+ The SoapClient::$sdl property is now a
+ Soap\Sdl object rather than a
+ soap_sdl &resource;.
+ Checks using is_resource (i.e.
+ is_resource($client->sdl)) should be replaced with checks
+ for &null; (i.e. $client->sdl !== null).
+
+
+
+
+
+ New warnings and exceptions
+
+
+ New warnings and exceptions have been added which are triggered on
+ programming errors, i.e. invalid values provided as arguments.
+
+
+
+ Curl
+
+
+ curl_multi_select now throws a
+ ValueError if the
+ timeout parameter is less than
+ 0 or greater than PHP_INT_MAX.
+
+
+
+
+ Gd
+
+
+
+ imagejpeg
+ imagewebp
+ imagepng
+ imageavif
+
+ now throw a ValueError when an invalid
+ quality is passed.
+
+
+
+ imageavif will now throw a
+ ValueError if an invalid
+ speed parameter value is passed.
+
+
+
+ imagescale will now throw a
+ ValueError if the
+ width or height
+ parameters underflows/overflows.
+
+
+
+ imagescale will now throw a
+ ValueError if an invalid
+ mode parameter value is passed.
+
+
+
+ imagefilter will now throw a
+ ValueError with the
+ IMG_FILTER_SCATTER filter
+ if the sub or plus
+ parameters underflows/overflows.
+
+
+
+
+ Gettext
+
+
+
+ bind_textdomain_codeset
+ textdomain
+ d*gettext
+
+ now throw a ValueError if
+ domainis the empty string.
+
+
+
+
+ Intl
+
+
+ resourcebundle_get,
+ ResourceBundle::get, and accessing offsets on
+ a ResourceBundle object now throw:
+
+
+ TypeError for invalid offset types
+
+
+ ValueError for an empty &string;
+
+
+ ValueError if the integer index does
+ not fit in a signed 32 bit integer
+
+
+
+
+
+ IntlDateFormatter::__construct throws a
+ ValueError if the
+ locale is invalid.
+
+
+
+ NumberFormatter::__construct throws a
+ ValueError if the
+ locale is invalid.
+
+
+
+
+ MBString
+
+
+ mb_encode_numericentity and
+ mb_decode_numericentity now check that the
+ map is only composed of &integer;s,
+ if not a ValueError is now thrown.
+
+
+
+ mb_http_input now always throw a
+ ValueError if type
+ is invalid.
+
+
+
+ mb_http_output now check that the
+ encoding does not contain any null bytes,
+ if it does a ValueError is now thrown.
+
+
+
+
+ ODBC
+
+
+ odbc_fetch_row returns &false; when
+ row is less than or equal to 0.
+ A warning is now emitted in this case.
+
+
+
+
+ PCNTL
+
+
+ The pcntl_sigprocmask,
+ pcntl_sigwaitinfo, and
+ pcntl_sigtimedwait functions now throw:
+
+
+ A ValueError if the
+ signals array is empty
+ (except for pcntl_sigprocmask if the
+ modeSIG_SETMASK)
+
+
+ A TypeError if a value of the
+ signals array is not an &integer;
+
+
+ A ValueError if a value of the
+ signals array is not a valid signal number
+
+
+
+
+
+ The pcntl_sigprocmask function now throws a
+ ValueError if the
+ mode is not one of SIG_BLOCK,
+ SIG_UNBLOCK, or SIG_SETMASK.
+
+
+
+ The pcntl_sigtimedwait function now throw:
+
+
+ A ValueError if
+ seconds is less than 0
+
+
+ A ValueError if
+ nanoseconds is less than 0
+ or greater than 1e9
+
+
+ A ValueError if both
+ seconds and nanoseconds
+ are 0
+
+
+
+
+
+
+ SimpleXML
+
+
+ Calling simplexml_import_dom with a non-XML object
+ now throws a TypeError instead of a
+ ValueError.
+
+
+
+
+ Standard
+
+
+ The round function now validates the value of the
+ mode and throw a
+ ValueError for invalid modes.
+ Previously, invalid modes would have been interpreted as
+ PHP_ROUND_HALF_UP.
+
+
+
+ The str_getcsv now throws
+ ValueErrors when the
+ separator and enclosure
+ arguments are not one byte long, or if the escape
+ argument is not one byte long nor the empty string.
+ This aligns the behaviour to be identical to the one of
+ fputcsv and fgetcsv.
+
+
+
+
+ The php_uname function now throws a
+ ValueError if the
+ mode is invalid.
+
+
+
+
+ The "allowed_classes" option for
+ unserialize now throws
+ TypeErrors and
+ ValueErrors if it is not an
+ array of class names.
+
+
+
+
+ XMLReader
+
+
+ Passing an invalid character encoding to
+ XMLReader::open or
+ XMLReader::XML now throws a
+ ValueError.
+
+
+
+ Passing a &string; containing null bytes previously emitted a
+ warning and now throws a ValueError.
+
+
+
+
+ XMLWriter
+
+
+ Passing a &string; containing null bytes previously emitted a
+ warning and now throws a ValueError.
+
+
+
+
+ XSL
+
+
+ XSLTProcessor::setParameter will now throw a
+ ValueError when its arguments contain null
+ bytes. This never actually worked correctly in the first place,
+ which is why it throws an exception now.
+
+
+
+ Calling XSLTProcessor::importStyleSheet with a
+ non-XML object now throws a TypeError
+ instead of a ValueError.
+
+
+
+
+ Failure to call a PHP function callback during evaluation now throws
+ instead of emitting a warning.
+
+
+
+
+
+ DOM
+
+
+ Some DOM methods previously returned &false; or a
+ PHP_ERRDOMException
+ if a new node could not be allocated.
+ They now consistently throw an INVALID_STATE_ERR
+ DOMException.
+ This situation is extremely unlikely and the probability of being affected
+ is low.
+ As a result DOMImplementation::createDocument
+ now has a tentative return type of DOMDocument
+
+ instead of DOMDocument|false.
+
+
+
+ Previously, DOMXPath objects could be cloned,
+ but resulted in an unusable object.
+ This is no longer possible, and cloning a DOMXPath
+ object now throws an Error.
+
+
+
+
+ The DOMImplementation::getFeature method has been removed.
+
+
+
+
+ GMP
+
+
+
+ The GMP class is now final and cannot be extended
+ anymore.
+
+
+
+
+ MBString
+
+
+ On invalid strings (those with encoding errors),
+ mb_substr now interprets character indices in the same
+ manner as most other mbstring functions.
+ This means that character indices returned by mb_strpos
+ can be passed to mb_substr.
+
+
+
+ For SJIS-Mac (MacJapanese) strings, character indices passed to
+ mb_substr now refer to the indices of the Unicode
+ codepoints which are produced when the string is converted to Unicode.
+ This is significant because around 40 SJIS-Mac characters convert to a
+ sequence of multiple Unicode codepoints.
+
+
+
+
+ MySQLi
+
+
+ The unused and undocumented constant
+ MYSQLI_SET_CHARSET_DIR has been removed.
+
+
+
+ The MYSQLI_STMT_ATTR_PREFETCH_ROWS constant has been
+ removed. The feature is unavailable with mysqlnd.
+
+
+
+ The MYSQLI_CURSOR_TYPE_FOR_UPDATE and
+ MYSQLI_CURSOR_TYPE_SCROLLABLE constants have been
+ removed. This functionality was never implemented,
+ neither with mysqlnd nor with libmysql.
+
+
+
+ The unused MYSQLI_TYPE_INTERVAL constant, which is
+ currently a stub and an alias for MYSQLI_TYPE_ENUM,
+ has been removed.
+
+
+
+
+
+ MySQLnd
+
+
+ The error code reported for MySQL server wait timeouts has been changed from
+ 2006 to 4031 for MySQL server
+ versions 8.0.24 and above.
+
+
+
+
+ Opcache
+
+
+ The maximum value of the
+ opcache.interned_strings_buffer
+ setting on 64bit architectures is now 32767.
+ Previously it was 4095.
+
+
+
+ JIT
+
+
+ The default configuration values for the JIT changed from
+ opcache.jit=tracing
+ and opcache.jit_buffer_size=0
+ to opcache.jit=disable
+ and opcache.jit_buffer_size=64M, respectively.
+
+
+
+ This does not affect the default observable behavior,
+ as the JIT is still disabled by default.
+ However, it is now disabled through the
+ opcache.jit setting,
+ rather than
+ opcache.jit_buffer_size.
+ This may affect users who previously enabled JIT through
+ opcache.jit_buffer_size
+ exclusively, without also specifying a JIT mode using
+ opcache.jit.
+ To enable JIT compilation, set the
+ opcache.jit config value accordingly.
+
+
+
+ If JIT compilation is enabled, PHP will now exit with a fatal error on
+ startup if the initialization of the JIT compiler failed for any reason.
+
+
+
+
+
+ PCNTL
+
+
+ The pcntl_sigprocmask,
+ pcntl_sigwaitinfo, and
+ pcntl_sigtimedwait functions now always
+ return &false; on failure.
+ In some case previously it could return the value -1.
+
+
+
+
+ PCRE
+
+
+ The bundled pcre2lib has been updated to version 10.44.
+ As a consequence, this means {,3} is now recognized
+ as a quantifier instead of as text.
+ Furthermore, the meaning of some character classes in UCP mode has changed.
+ Consult the PCRE2 Changelog
+ for a full changelog.
+
+
+
+
+ PDO_DBLIB
+
+
+ The DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER and
+ DBLIB_ATTR_DATETIME_CONVERT attributes now act as
+ boolean attributes instead of integer attributes.
+ Thus setting the attribute via PDO::setAttribute
+ and retrieving it via PDO::getAttribute expects
+ and or return a bool.
+
+
+
+
+ PDO_FIREBIRD
+
+
+ The ATTR_AUTOCOMMIT attribute now act as
+ boolean attributes instead of integer attributes.
+ Thus setting the attribute via PDO::setAttribute
+ and retrieving it via PDO::getAttribute expects
+ and or return a bool.
+
+
+
+ The extension now exposes some Firebird C++ APIs,
+ therefore building this extension now requires a C++ compiler.
+ Moreover, the extension must now be compiled against fbclient 3.0 or higher.
+
+
+
+
+ PDO_MYSQL
+
+
+ The ATTR_AUTOCOMMIT,
+ ATTR_EMULATE_PREPARES, and
+ MYSQL_ATTR_DIRECT_QUERY attributes now act as
+ boolean attributes instead of integer attributes.
+ Thus setting the attribute via PDO::setAttribute
+ and retrieving it via PDO::getAttribute expects
+ and or return a bool.
+
+
+
+
+ PDO_PGSQL
+
+
+ The DSN's credentials, when set, are given priority over their PDO
+ constructor counterparts, being closer to the documentation states.
+
+
+
+
+ SimpleXML
+
+
+ SimpleXMLElement is not only a representation of an
+ XML element, but it is also a RecursiveIterator.
+ Prior to PHP 8.4.0, some of its methods (e.g.
+ SimpleXMLElement::asXML or
+ SimpleXMLElement::getName) and casting such
+ instances to &string; would implicitly reset the iterator.
+
+
+ This could cause unexpected infinite loops as the iterator was rewound.
+ For example:
+
+
+123";
+$xml = simplexml_load_string($xmlString);
+
+$nodes = $xml->a->b;
+foreach ($nodes as $nodeData) {
+ echo "nodeData: " . $nodeData . "\n";
+
+ $xml = $nodes->asXml();
+}
+
+]]>
+
+ would result in an infinite loop.
+
+
+
+ However, this behavior has now been corrected, and a
+ SimpleXMLElement will no longer implicitly reset
+ the iterator data, unless explicitly rewound.
+ Meaning the previous example would now result in:
+
+
+
+
+
+
+
+
+
+ SOAP
+
+
+ SoapClient::$typemap is now an array
+ rather than a resource.
+ Checks using is_resource (i.e.
+ is_resource($client->typemap)) should be
+ replaced with checks for &null; (i.e. $client->typemap !== null).
+
+
+
+ The SOAP extension gained an optional dependency on the
+ session extension.
+ If PHP is built without the session extension and with the
+ configure flag enabled,
+ startup errors will now occur if the SOAP
+ extension is also used.
+ To solve this either don't use rtld-now or load the session extension.
+
+
+
+
+ Standard
+
+
+ When using strcspn with
+ characters being the empty string,
+ the length of the string is now returned instead of incorrectly stopping
+ at the first null byte.
+
+
+
+
+ http_build_query now correctly handles backed enums.
+
+
+
+
+ stream_bucket_make_writeable and
+ stream_bucket_new will now return a
+ StreamBucket instance instead of an instance of
+ stdClass.
+
+
+
+
+ Tidy
+
+
+ Failures in the constructor now throw exceptions rather than emitting
+ warnings and having a broken object.
+
+
+
+
+ XML
+
+
+ The xml_set_*_handler
+ functions now declare and check for an effective
+ signature of callablestringnull for the
+ handler parameters.
+ Moreover, values of type string that correspond to method names,
+ of object set with xml_set_object are now checked to
+ see if the method exists on the class of the previously passed object.
+ This means that xml_set_object must now always be
+ called prior to setting method names as callables.
+ Passing an empty string to disable the handler is still allowed,
+ but deprecated.
+
+
+
+ However, as xml_set_object and passing
+ non-callable strings is deprecated.
+ It is recommended to change such instances with a callable
+ referring to the method directly.
+
+
+
+
+
diff --git a/appendices/migration84/new-classes.xml b/appendices/migration84/new-classes.xml
new file mode 100644
index 000000000000..794f4697b4c0
--- /dev/null
+++ b/appendices/migration84/new-classes.xml
@@ -0,0 +1,164 @@
+
+
+ New Classes, Enums, and Interfaces
+
+
+ Core
+
+ Deprecated
+ RequestParseBodyException
+
+
+
+
+ BCMath
+
+ BcMath\Number
+
+
+
+
+ DBA
+
+ Dba\Connection
+
+
+
+
+ DOM
+
+ Dom\HTMLDocument
+ Dom\XMLDocument
+ Dom\Document
+ Dom\ParentNode
+ Dom\ChildNode
+ Dom\Implementation
+ Dom\Node
+ Dom\NodeList
+ Dom\NamedNodeMap
+ Dom\DtdNamedNodeMap
+ Dom\HTMLCollection
+ Dom\AdjacentPosition
+ Dom\Element
+ Dom\HTMLElement
+ Dom\Attr
+ Dom\CharacterData
+ Dom\Text
+ Dom\CDATASection
+ Dom\ProcessingInstruction
+ Dom\Comment
+ Dom\DocumentType
+ Dom\DocumentFragment
+ Dom\Entity
+ Dom\EntityReference
+ Dom\Notation
+ Dom\TokenList
+ Dom\NamespaceInfo
+ Dom\XPath
+
+
+
+
+ ODBC
+
+ Odbc\Connection
+ Odbc\Result
+
+
+
+
+ PCNTL
+
+
+ Pcntl\QosClass (macOS only)
+
+
+
+
+ PDO_DBLIB
+
+ Pdo\DbLib
+
+
+
+
+ PDO_FIREBIRD
+
+ Pdo\Firebird
+
+
+
+
+ PDO_MYSQL
+
+ Pdo\Mysql
+
+
+
+
+ PDO_ODBC
+
+ Pdo\Odbc
+
+
+
+
+ PDO_PGSQL
+
+ Pdo\Pgsql
+
+
+
+
+ PDO_SQLITE
+
+ Pdo\Sqlite
+
+
+
+
+ Reflection
+
+ ReflectionConstant
+
+
+
+
+ SOAP
+
+ Soap\Url
+ Soap\Sdl
+
+
+
+
+ Standard
+
+
+
+ RoundingMode
+ StreamBucket
+
+
+
+
+
diff --git a/appendices/migration84/new-features.xml b/appendices/migration84/new-features.xml
new file mode 100644
index 000000000000..a07d9ec6354b
--- /dev/null
+++ b/appendices/migration84/new-features.xml
@@ -0,0 +1,545 @@
+
+
+ New Features
+
+
+
+ PHP Core
+
+
+
+ Property Hooks
+
+
+ TODO
+
+
+
+
+
+
+
+
+
+
+
+ Asymmetric Property Visibility
+
+
+ Object properties may now have their set visibility controlled separately from the get visibility.
+
+
+
+name = $name;
+ }
+}
+]]>
+
+
+
+
+
+
+ Lazy Objects
+
+
+ TODO
+
+
+
+
+
+ #[\Deprecated] attribute
+
+
+ TODO
+
+
+
+
+
+ Parsing RFC1867 (multipart) requests in non-POST HTTP requests
+
+
+
+ Added request_parse_body function that allows parsing
+ RFC1867 (multipart) requests in non-POST HTTP requests.
+
+
+
+
+
+ Chaining &new; expressions without parentheses
+
+
+
+ New expressions with constructor arguments are now dereferencable, meaning
+ they allow chaining method calls, property accesses, etc. without enclosing
+ the expression in parentheses.
+
+
+
+
+ Improved Debugging Info for WeakReference
+
+
+
+ Getting the debug info for WeakReference will now
+ also output the object it references, or &null; if the reference is no
+ longer valid.
+
+
+
+
+ Improved Debugging Info for Closure
+
+
+
+ The output of Closure::__debugInfo now includes
+ the name, file, and line of the Closure.
+
+
+
+
+
+ Defining Identical Symbols in Different Namespace Blocks
+
+
+
+ Exiting a namespace now clears seen symbols.
+ This allows using a symbol in a namespace block, even if a previous
+ namespace block declared a symbol with the same name.
+
+
+
+
+
+
+
+ cURL
+
+
+ curl_version returns an additional
+ feature_list value, which is an associative array
+ of all known cURL features, and whether they are supported (&true;)
+ or not (&false;).
+
+
+
+ Added CURL_HTTP_VERSION_3 and
+ CURL_HTTP_VERSION_3ONLY constants (available
+ since libcurl 7.66 and 7.88) as available options for
+ CURLOPT_HTTP_VERSION.
+
+
+
+ Added CURLOPT_PREREQFUNCTION as a cURL option that
+ accepts a callable to be called after the connection is made,
+ but before the request is sent.
+ This callable must return either CURL_PREREQFUNC_OK or
+ CURL_PREREQFUNC_ABORT to allow or abort the request.
+
+
+
+ Added CURLOPT_SERVER_RESPONSE_TIMEOUT,
+ which was formerly known as CURLOPT_FTP_RESPONSE_TIMEOUT.
+ Both constants hold the same value.
+
+
+
+ Added CURLOPT_DEBUGFUNCTION as a cURL option that
+ accepts a callable that gets called during the request lifetime
+ with the CurlHandle object,
+ an integer containing the debug message type, and a string containing the
+ debug message.
+ The debug message type is one of the following constants:
+
+ CURLINFO_TEXT
+ CURLINFO_HEADER_IN
+ CURLINFO_HEADER_OUT
+ CURLINFO_DATA_IN
+ CURLINFO_DATA_OUT
+ CURLINFO_SSL_DATA_IN
+ CURLINFO_SSL_DATA_OUT
+
+ Once this option is set, CURLINFO_HEADER_OUT
+ must not be set because it uses the same libcurl functionality.
+
+
+
+ The curl_getinfo now returns an additional
+ posttransfer_time_us key, containing the number of
+ microseconds from the start until the last byte is sent.
+ When a redirect is followed, the time from each request is added together.
+ This value can also be retrieved by passing
+ CURLINFO_POSTTRANSFER_TIME_T to the
+ curl_getinfooption parameter.
+ This requires libcurl 8.10.0 or later.
+
+
+
+
+ DOM
+
+
+ Added the DOMNode::compareDocumentPosition
+ with its associated constants:
+
+ DOMNode::DOCUMENT_POSITION_DISCONNECTED
+ DOMNode::DOCUMENT_POSITION_PRECEDING
+ DOMNode::DOCUMENT_POSITION_FOLLOWING
+ DOMNode::DOCUMENT_POSITION_CONTAINS
+ DOMNode::DOCUMENT_POSITION_CONTAINED_BY
+ DOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
+
+
+
+
+
+ It is now possible to pass any callable to
+ DOMXPath::registerPhpFunctions.
+
+
+
+
+
+
+ FPM
+
+
+ Flushing headers without a body will now succeed.
+
+
+
+
+ Status page has a new field to display a memory peak.
+
+
+
+
+ Intl
+
+
+ Added the NumberFormatter::ROUND_HALFODD to
+ complement the existing NumberFormatter::ROUND_HALFEVEN
+ functionality.
+
+
+
+
+ OpenSSL
+
+
+ Added support for Curve25519 + Curve448 based keys.
+ Specifically x25519, ed25519, x448 and ed448 fields are supported in
+ openssl_pkey_new,
+ openssl_pkey_get_details,
+ openssl_sign, and
+ openssl_verify were extended to support those keys.
+
+
+
+ Implement PASSWORD_ARGON2 password hashing.
+ Requires OpenSSL 3.2 and NTS build.
+
+
+
+
+ PCRE
+
+
+ The bundled pcre2lib has been updated to version 10.44.
+ As a consequence, LoongArch JIT support has been added, spaces
+ are now allowed between braces in Perl-compatible items, and
+ variable-length lookbehind assertions are now supported.
+
+
+
+ With pcre2lib version 10.44, the maximum length of named capture groups
+ has changed from 32 to 128.
+
+
+
+ Added support for the r (PCRE2_EXTRA_CASELESS_RESTRICT)
+ modifier, as well as the (?r) mode modifier.
+ When enabled along with the case-insensitive modifier (i),
+ the expression locks out mixing of ASCII and non-ASCII characters.
+
+
+
+
+ PDO
+
+
+
+ Added support for driver-specific subclasses.
+ This RFC adds subclasses for PDO in order to better support
+ database-specific functionalities.
+ The new classes are instantiatable either via calling the
+ PDO::connect method or by instantiating an instance
+ of the driver-specific subclass directly.
+
+
+
+
+ Added support for driver specific SQL parsers.
+ The default parser supports:
+
+
+ single and double-quoted literals, with doubling as escaping mechanism
+
+
+ two-dashes and non-nested C-style comments
+
+
+
+
+
+
+ PDO_MYSQL
+
+
+
+ Added a custom parser supporting:
+
+
+ single and double-quoted literals, with doubling and backslash as escaping
+ mechanism
+
+
+ backtick literal identifiers and with doubling as escaping mechanism
+
+
+ two dashes followed by at least 1 whitespace, non-nested C-style comments,
+ and hash-comments
+
+
+
+
+
+
+ PDO_PGSQL
+
+
+
+ Added a custom parser supporting:
+
+
+ single and double-quoted literals, with doubling as escaping mechanism
+
+
+ C-style "escape" string literals (E'string')
+
+
+ dollar-quoted string literals
+
+
+ two-dashes and C-style comments (non-nested)
+
+
+ support for ?? as escape sequence for the
+ ? operator
+
+
+
+
+
+
+ PDO_SQLITE
+
+
+
+ Added a custom parser supporting:
+
+
+ single, double-quoted, and backtick literals, with doubling as
+ escaping mechanism
+
+
+ square brackets quoting for identifiers
+
+
+ two-dashes and C-style comments (non-nested)
+
+
+
+
+
+
+ Phar
+
+
+ Added support for the Unix timestamp extension for Zip archives.
+
+
+
+
+ Readfile
+
+
+ Added ability to change the .php_history path through
+ the PHP_HISTFILE environment variable.
+
+
+
+
+ Reflection
+
+
+ ReflectionAttribute now contains a
+ name property to improve the debugging experience.
+
+
+
+ ReflectionClassConstant::__toString and
+ ReflectionProperty::__toString now returns the
+ attached doc comments.
+
+
+
+
+ Multiple new methods and constants which are related to the lazy objects
+ feature have been added:
+
+
+
+ ReflectionClass::newLazyGhost
+
+
+ ReflectionClass::newLazyProxy
+
+
+ ReflectionClass::resetAsLazyGhost
+
+
+ ReflectionClass::resetAsLazyProxy
+
+
+ ReflectionClass::isUninitializedLazyObject
+
+
+ ReflectionClass::initializeLazyObject
+
+
+ ReflectionClass::markLazyObjectAsInitialized
+
+
+ ReflectionClass::getLazyInitializer
+
+
+ ReflectionClass::skipLazyInitialization
+
+
+ ReflectionClass::setRawValueWithoutLazyInitialization
+
+
+ ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
+
+
+ ReflectionClass::SKIP_DESTRUCTOR
+
+
+
+
+
+
+ SOAP
+
+
+ Added support for clark notation for namespaces in class map.
+ It is now possible to specify entries in a class map with clark notation
+ to resolve a type with a specific namespace to a specific class.
+ For example: '{http://example.com}foo' => 'FooClass'.
+
+
+
+ Instances of DateTimeInterface that are
+ passed to xsd:datetime or similar elements are now
+ serialized as such instead of being serialized as an empty string.
+
+
+
+ Session persistence now works with a shared session module.
+
+
+
+
+ Standard
+
+
+
+
+ Added a new RoundingMode enum with clearer naming
+ and improved discoverability compared to the
+ PHP_ROUND_* constants.
+ Moreover, four new rounding modes were added which are only available via
+ the new RoundingMode enum.
+
+
+
+
+ XSL
+
+
+ It is now possible to use parameters that contain both single and double
+ quotes.
+
+
+
+
+ It is now possible to pass any callable to
+ XSLTProcessor::registerPhpFunctions.
+
+
+
+
+ Added XSLTProcessor::$maxTemplateDepth and
+ XSLTProcessor::$maxTemplateVars
+ to control the recursion depth of XSL template evaluation.
+
+
+
+
+ Zip
+
+
+ Added the ZipArchive::ER_TRUNCATED_ZIP
+ constant, which was added in libzip 1.11.
+
+
+
+
+
diff --git a/appendices/migration84/new-functions.xml b/appendices/migration84/new-functions.xml
new file mode 100644
index 000000000000..65d32eec8e67
--- /dev/null
+++ b/appendices/migration84/new-functions.xml
@@ -0,0 +1,331 @@
+
+
+ New Functions
+
+
+ Core
+
+
+
+ request_parse_body
+
+
+
+
+ BCMath
+
+
+
+
+ bcceil
+ bcdivmod
+ bcfloor
+ bcround
+
+
+
+
+ Date
+
+
+ DateTime::createFromTimestamp
+
+
+ DateTime::getMicrosecond
+
+
+ DateTime::setMicrosecond
+
+
+ DateTimeImmutable::createFromTimestamp
+
+
+ DateTimeImmutable::getMicrosecond
+
+
+ DateTimeImmutable::setMicrosecond
+
+
+
+
+
+ DOM
+
+
+ DOMNode::compareDocumentPosition
+
+
+
+ DOMXPath::registerPhpFunctionNS
+
+
+ DOMXPath::quote
+
+
+ DOMNode::compareDocumentPosition
+
+
+
+
+
+ Hash
+
+
+ HashContext::__debugInfo
+
+
+
+
+
+ Intl
+
+
+ IntlDateFormatter::getIanaID
+
+ intltz_get_iana_id
+
+ IntlDateFormatter::parseToCalendar
+
+
+ SpoofChecker::setAllowedChars
+
+
+ grapheme_str_split
+
+
+
+
+ MBString
+
+
+
+ mb_trim
+ mb_ltrim
+ mb_rtrim
+
+ mb_ucfirst
+ mb_lcfirst
+
+
+
+
+ Opcache
+
+ opcache_jit_blacklist
+
+
+
+
+ PCNTL
+
+
+ pcntl_getcpu
+ pcntl_getcpuaffinity
+ pcntl_getqos_class
+ pcntl_setns
+ pcntl_waitid
+
+
+
+
+ PDO_PGSQL
+
+
+ Pdo\Pgsql::setNoticeCallback
+
+
+
+
+
+ PGSQL
+
+
+ pg_change_password
+ pg_jit
+ pg_put_copy_data
+ pg_put_copy_end
+ pg_result_memory_size
+ pg_set_chunked_rows_size
+ pg_socket_poll
+
+
+
+
+ Reflection
+
+
+
+
+ The following methods relate to the new lazy object feature:
+
+
+ ReflectionClass::newLazyGhost
+
+
+ ReflectionClass::newLazyProxy
+
+
+ ReflectionClass::resetAsLazyGhost
+
+
+ ReflectionClass::resetAsLazyProxy
+
+
+ ReflectionClass::isUninitializedLazyObject
+
+
+ ReflectionClass::initializeLazyObject
+
+
+ ReflectionClass::markLazyObjectAsInitialized
+
+
+ ReflectionClass::getLazyInitializer
+
+
+ ReflectionClass::skipLazyInitialization
+
+
+ ReflectionClass::setRawValueWithoutLazyInitialization
+
+
+
+
+
+
+ ReflectionClassConstant::isDeprecated
+
+
+ ReflectionGenerator::isClosed
+
+
+ ReflectionProperty::isDynamic
+
+
+
+
+
+ Sodium
+
+
+ sodium_crypto_aead_aegis128l_*
+ sodium_crypto_aead_aegis256l_*
+
+
+
+
+ SPL
+
+
+
+ SplObjectStorage::seek
+
+
+
+
+
+ SOAP
+
+
+
+ SoapServer::__getLastResponse
+
+
+
+
+
+ Standard
+
+
+ http_get_last_response_headers
+ http_clear_last_response_headers
+
+ fpow
+
+ array_all
+ array_any
+ array_find
+ array_find_key
+
+
+
+
+
+ Tidy
+
+
+
+ tidyNode::getNextSibling
+
+
+ tidyNode::getPreviousSibling
+
+
+
+
+
+ XMLReader
+
+
+
+
+ XMLReader::fromStream
+
+
+ XMLReader::fromUri
+
+
+ XMLReader::fromString
+
+
+
+
+
+ XMLWriter
+
+
+
+
+ XMLWriter::toStream
+
+
+ XMLWriter::toUri
+
+
+ XMLWriter::toMemory
+
+
+
+
+
+ XSL
+
+
+
+
+ XSLTProcessor::registerPhpFunctionNS
+
+
+
+
+
+
diff --git a/appendices/migration84/other-changes.xml b/appendices/migration84/other-changes.xml
new file mode 100644
index 000000000000..c884e783542a
--- /dev/null
+++ b/appendices/migration84/other-changes.xml
@@ -0,0 +1,771 @@
+
+
+ Other Changes
+
+
+ Core changes
+
+
+ Closures
+
+
+ Closure names have been adjusted to include the parent function's name
+ and the line of definition to make them easier to distinguish, for example
+ within stack traces.
+
+
+
+
+ Fibers
+
+
+ Fiber switching during destructor execution is now allowed. It was previously
+ blocked due to conflicts with garbage collection.
+
+
+
+ Destructors may now be executed in a separate Fiber:
+
+
+
+ When garbage collection is triggered in a Fiber,
+ destructors called by the GC are executed in a separate Fiber:
+ the gc_destructor_fiber.
+ If this Fiber suspends, a new one is created to execute the remaining
+ destructors.
+ The previous gc_destructor_fiber is not referenced anymore by the GC
+ and may be collected if it's not referenced anywhere else.
+ Objects whose destructor is suspended will not be collected until the
+ destructor returns or the Fiber is collected.
+
+
+
+
+ Output Handlers
+
+
+ Output handler status flags passed to the flags
+ parameter of ob_start are now cleared.
+
+
+
+ output_add_rewrite_var now uses
+ url_rewriter.hosts
+ instead of
+ session.trans_sid_hosts
+ for selecting hosts that will be rewritten.
+
+
+
+
+
+ Changes in SAPI Modules
+
+
+ apache2handler
+
+
+ Support for EOL Apache 2.0 and 2.2 has been removed.
+ Minimum required Apache version is now 2.4.
+
+
+
+
+ CLI
+
+
+ The builtin server looks for an index file recursively by traversing parent
+ directories in case the specified file cannot be located.
+ This process was previously skipped if the path looked like it was
+ referring to a file, i.e. if the last path component contained a period.
+ In that case, a 404 error was returned.
+ The behavior has been changed to look for an index file in all cases.
+
+
+
+
+ FPM
+
+
+
+ The /dev/pollevents.mechanism
+ setting for Solaris/Illumos had been retired.
+
+
+
+
+
+ Changed Functions
+
+
+ Core
+
+
+ trigger_error and user_error
+ now have a return type of true instead of bool.
+
+
+
+
+ DOM
+
+
+ DOMDocument::registerNodeClass
+ now has a tentative return type of true instead of
+ bool.
+ It could only ever return &true; in practice.
+
+
+
+
+ Hash
+
+
+ hash_update
+ now has a tentative return type of true instead of
+ bool.
+ It could only ever return &true; in practice.
+
+
+
+
+ Intl
+
+
+ NumberFormatter::ROUND_TOWARD_ZERO and
+ NumberFormatter::ROUND_AWAY_FROM_ZERO
+ have been added as aliases for
+ NumberFormatter::ROUND_DOWN and
+ NumberFormatter::ROUND_UP
+ to be consistent with the new
+ PHP_ROUND_* modes.
+
+
+
+ ResourceBundle::get
+
+ now has a tentative return type of ResourceBundle|array|string|int|null.
+
+
+
+ The idn_to_ascii and idn_to_utf8
+ functions now always throw ValueErrors
+ if the domain name is empty or too long.
+
+
+
+ The idn_to_ascii and idn_to_utf8
+ functions now always throw ValueError
+ if the variant parameter is not
+ INTL_IDNA_VARIANT_UTS46.
+
+
+
+
+ LibXML
+
+
+ libxml_set_streams_context now immediately throws a
+ TypeError when a non-stream-context
+ resource is passed to the function,
+ instead of throwing later when the stream context is used.
+
+
+
+
+ MBString
+
+
+ The behavior of mb_strcut is more consistent
+ now on invalid UTF-8 and UTF-16 strings.
+ There is no behavioural change for valid UTF-8 and UTF-16 strings.
+
+
+
+
+ ODBC
+
+
+ The row of
+ odbc_fetch_object,
+ odbc_fetch_array, and
+ odbc_fetch_into now have a default value of &null;,
+ consistent with odbc_fetch_row.
+ Previously, the default values were
+ -1,
+ -1,
+ and 0,
+ respectively.
+
+
+
+
+ OpenSSL
+
+
+ The extra_attributes in
+ openssl_csr_new sets the CSR
+ attributes instead of subject DN, which incorrectly done previously.
+
+
+
+ The dn in
+ openssl_csr_new allows setting an array
+ of values for a single entry.
+
+
+
+ New serial_hex added to
+ openssl_csr_sign to allow setting serial numbers
+ in the hexadecimal format.
+
+
+
+ Parsing ASN.1 UTCTime with openssl_x509_parse
+ fails if seconds are omitted for OpenSSL version below 3.2
+ (-1 is returned for such fields).
+ OpenSSL version above 3.3 did not load such certificates already.
+
+
+
+
+ PDO
+
+
+ It is now possible to fetch the value of the
+ PDO::ATTR_STRINGIFY_FETCHES attribute with
+ PDO::getAttribute.
+
+
+
+ A new PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE
+ has been added to retrieve the memory usage of query results with
+ PDO::getAttribute for drivers that support it.
+
+
+
+
+ PDO_FIREBIRD
+
+
+ It is now possible to fetch the value of the
+
+ FB_ATTR_DATE_FORMAT,
+ FB_ATTR_TIME_FORMAT,
+ FB_ATTR_TIMESTAMP_FORMAT,
+ attributes with
+
+ PDO::getAttribute.
+
+
+
+ Added new attributes to specify transaction isolation level and access mode.
+ Five constants relating to this functionality have been added:
+
+
+ Pdo\Firebird::TRANSACTION_ISOLATION_LEVEL
+ Pdo\Firebird::READ_COMMITTED
+ Pdo\Firebird::REPEATABLE_READ
+ Pdo\Firebird::SERIALIZABLE
+ Pdo\Firebird::WRITABLE_TRANSACTION
+
+
+
+
+ When using persistent connections, there is now a liveliness check in the
+ constructor.
+
+
+
+ The content that is built changes depending on the value of
+ FB_API_VER in
+ ibase.h.
+ A new static method Pdo\Firebird::getApiVersion
+ can be used to obtain this information.
+ This information is also now referenced in phpinfo.
+
+
+
+ Five new data types are now available:
+
+ INT128
+ DEC16
+ DEC34
+ TIMESTAMP_TZ
+ TIME_TZ
+
+ .
+ These are available starting with Firebird 4.0.
+
+
+
+
+ PDO_MYSQL
+
+
+ It is now possible to fetch the value of the
+ PDO::ATTR_FETCH_TABLE_NAMES attribute with
+
+ PDO::getAttribute.
+
+
+
+
+ PDO_PGSQL
+
+
+ Support retrieving the memory usage of queries for
+ PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE.
+
+
+
+ If the column is of type FLOAT4OID or
+ FLOAT8OID the value will now be returned as a
+ float instead of a string.
+
+
+
+
+ PGSQL
+
+
+ The conditions parameter of
+ pg_select is now optional and accepts an empty array.
+
+
+
+
+ Phar
+
+
+ The
+
+ Phar::setAlias
+ Phar::setDefaultStub
+
+ methods now have a tentative return type of true
+ instead of bool.
+
+
+
+
+ POSIX
+
+
+ posix_isatty now sets the error number when the
+ file descriptor/stream argument is invalid.
+
+
+
+
+ Reflection
+
+
+ ReflectionGenerator::getFunction
+ may now be called after the generator finished executing.
+
+
+
+
+ Sockets
+
+
+ The backlog parameter of
+ socket_create_listen( now has a default value of
+ SOMAXCONN.
+ Previously, it was 128.
+
+
+
+
+ Sodium
+
+
+ The sodium_crypto_aead_aes256gcm_*
+ functions are now available on aarch64 CPUs with the ARM cryptographic
+ extensions.
+
+
+
+
+ SPL
+
+
+ The
+
+ SplPriorityQueue::insert
+ SplPriorityQueue::recoverFromCorruption
+ SplHeap::insert
+ SplHeap::recoverFromCorruption
+
+ methods now have a tentative return type of true
+ instead of bool.
+
+
+
+ SplObjectStorage now implements
+ SeekableIterator.
+
+
+
+
+ Standard
+
+
+
+ PASSWORD_BCRYPT for password_hash
+ has been increased from 10 to 12.
+
+
+
+
+ debug_zval_dump now indicates whether an array is packed.
+
+
+
+ long2ip now has a return type of string
+
+ instead of string|false.
+
+
+
+
+ highlight_string now has a return type of
+ string|true instead of string|bool.
+
+
+
+
+ print_r now has a return type of
+ string|true instead of string|bool.
+
+
+
+
+ Rounding with round
+
+
+ The $mode parameter of the round() function has been widened to RoundingMode|int,
+ accepting instances of a new RoundingMode enum.
+
+
+
+
+ Four new modes have been added to the round() function: RoundingMode::PositiveInfinity,
+ RoundingMode::NegativeInfinity, RoundingMode::TowardsZero, RoundingMode::AwayFromZero.
+
+
+
+
+ The internal implementation for rounding to integers has been rewritten
+ to be easier to verify for correctness and to be easier to maintain.
+ Some rounding bugs have been fixed as a result of the rewrite.
+ For example previously rounding 0.49999999999999994 to the nearest integer
+ would have resulted in 1.0 instead of the correct result 0.0.
+ Additional inputs might also be affected and result in different outputs
+ compared to earlier PHP versions.
+
+
+
+ Fixed a bug caused by "pre-rounding" of the round() function.
+ Previously, using "pre-rounding" to treat a value like 0.285
+ (actually 0.28499999999999998) as a decimal number and round it to 0.29.
+ However, "pre-rounding" incorrectly rounds certain numbers,
+ so this fix removes "pre-rounding" and changes the way numbers are compared,
+ so that the values are correctly rounded as decimal numbers.
+
+
+
+ The maximum precision that can be handled by round() has been extended
+ by one digit.
+ For example, round(4503599627370495.5) returned in
+ 4503599627370495.5,
+ but now returns 4503599627370496.
+
+
+
+
+
+
+
+
+ Other Changes to Extensions
+
+
+ cURL
+
+
+ The minimum libcurl version required is now 7.61.0.
+
+
+
+ The CURLOPT_DNS_USE_GLOBAL_CACHE option no longer
+ has any effect, and is silently ignored.
+ This underlying feature was deprecated in libcurl 7.11.1,
+ and removed in libcurl 7.62.0.
+
+
+
+
+ GMP
+
+
+
+ Casting a GMP object to bool is now
+ possible instead of emitting a E_RECOVERABLE_ERROR.
+ The casting behaviour is overloaded such that a GMP
+ object representing the value 0 is cast to &false;.
+
+
+
+
+ LibXML
+
+
+ The minimum libxml2 version required is now 2.9.4.
+
+
+
+
+ Intl
+
+
+ The behaviour of Intl class has been normalized to always throw
+ Error exceptions when attempting to use
+ a non-initialized object, or when cloning fails.
+
+
+
+
+ MBString
+
+
+ Unicode data tables have been updated to Unicode 16.0.
+
+
+
+
+ MySQLnd
+
+
+ Support for the new VECTOR data type from MySQL 9.
+
+
+
+
+ OpenSSL
+
+
+ The minimum OpenSSL version required is now 1.1.1.
+
+
+
+
+ PDO_PGSQL
+
+
+ The minimum libpq version required is now 10.0.
+
+
+
+
+ PGSQL
+
+
+ The minimum libpq version required is now 10.0.
+
+
+
+
+ SPL
+
+
+ Out of bounds accesses in SplFixedArray now throw
+ exceptions of type OutOfBoundsException
+ instead of RuntimeException.
+ Because OutOfBoundsException is a child
+ class of RuntimeException no behavioural
+ changes are exhibited when attempting to catch those exceptions.
+
+
+
+
+ XSL
+
+
+ The typed properties XSLTProcessor::$cloneDocument
+ and XSLTProcessor::$doXInclude are now declared
+
+
+
+
+ Zlib
+
+
+ The minimum zlib version required is now 1.2.11.
+
+
+
+
+
+ Performance
+
+
+ Core
+
+
+ Improved the performance of floating point number parsing and formatting in
+ ZTS builds under highly concurrent loads.
+ This affects the printf() family of functions as well
+ as serialization functions such as json_encode,
+ or serialize().
+
+
+
+ sprintf using only %s and
+ %d specifiers will be compiled into the equivalent
+ string interpolation, avoiding the overhead of a function call and
+ repeatedly parsing the format string.
+
+
+
+
+ BCMath
+
+
+ Improved performance of number conversions and operations.
+
+
+
+
+ DOM
+
+
+ The performance of DOMNode::C14N() is greatly
+ improved for the case without an xpath query.
+ This can give a time improvement of easily two order of
+ magnitude for documents with tens of thousands of nodes.
+
+
+
+ Improved performance and reduce memory consumption of XML serialization.
+
+
+
+ Reduced memory usage of node classes.
+
+
+
+
+ FTP
+
+
+ Improved the performance of FTP uploads up to a factor of 10x for large
+ uploads.
+
+
+
+
+ Hash
+
+
+ Added SSE2 and SHA-NI implementations of SHA-256.
+ This improves the performance on supported CPUs by ~1.3x (SSE2),
+ and 3x - 5x (SHA-NI).
+ Credit to Colin Percival / Tarsnap for this optimization.
+
+
+
+
+ MBString
+
+
+ mb_strcut is much faster now for UTF-8
+ and UTF-16 strings.
+
+
+
+ Looking up mbstring encoding names is much faster now.
+
+
+
+ The performance of converting SJIS-win to Unicode is greatly improved.
+
+
+
+
+ MySQLnd
+
+
+ Improved the performance of MySQLnd quoting.
+
+
+
+
+ PCRE
+
+
+ Improved the performance of named capture groups.
+
+
+
+
+ Random
+
+
+ Improved the performance of \Random\Randomizer,
+ with a specific focus on the
+ \Random\Randomizer::getBytes,
+ and getBytesFromString() methods.
+
+
+
+
+ SimpleXML
+
+
+ Improved performance and reduce memory consumption of XML serialization.
+
+
+
+
+ Standard
+
+
+ The performance of strspn and
+ strcspn is greatly improved.
+ They now run in linear time instead of being bounded by quadratic time.
+
+
+
+ Improved the performance of strpbrk.
+
+
+
+ get_browser is much faster now,
+ up to 1.5x - 2.5x for some test cases.
+
+
+
+
+
+
diff --git a/appendices/migration84/removed-extensions.xml b/appendices/migration84/removed-extensions.xml
new file mode 100644
index 000000000000..ad64c94103ca
--- /dev/null
+++ b/appendices/migration84/removed-extensions.xml
@@ -0,0 +1,37 @@
+
+
+ Removed Extensions
+
+
+ These extensions have been moved to PECL and are no longer part of the PHP
+ distribution. New releases for the PECL packages will be published on an
+ ad-hoc basis according to user demand.
+
+
+
+ IMAP
+ OCI8
+ PDO_OCI
+ PSpell
+
+
+
diff --git a/appendices/migration84/windows-support.xml b/appendices/migration84/windows-support.xml
new file mode 100644
index 000000000000..645d79fbf126
--- /dev/null
+++ b/appendices/migration84/windows-support.xml
@@ -0,0 +1,44 @@
+
+
+ Windows Support
+
+
+ Core
+
+
+ Building with Visual Studio now requires at least Visual Studio 2019.
+ However, Visual Studio 2022 is recommended.
+
+
+
+ AVX(2) CPU support is now properly detected for MSVC builds.
+
+
+
+ Native AVX-512 builds are now supported via the
+
+ configure option.
+
+
+
+
+