Commit 7f8a74fb29d for php.net

commit 7f8a74fb29d4d2f99f7f9549b5bfd38ff68a8d52
Author: Matteo Beccati <mbeccati@php.net>
Date:   Tue Sep 22 13:36:46 2026 +0200

    master is now for PHP 8.7.0-dev

diff --git a/NEWS b/NEWS
index 02da37e8108..abfba60f153 100644
--- a/NEWS
+++ b/NEWS
@@ -1,1130 +1,5 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-?? ??? ????, PHP 8.6.0RC1
-
-- Core:
-  . Fixed incorrect internal pointer and foreach iterator positions when
-    compacting arrays with holes. (Weilin Du)
-  . Fix handling of references to typed properties during unserialization
-    of various internal classes. (ndossche, timwolla)
-  . Fixed OSS-Fuzz 532353396 (assertion	failure	with static type). (Girgias)
-  . Fix GH-23662 (Avoid NAN warning in print_r()). (CodedByManish)
-  . Fixed bug GH-23752 (Use scoped diagnostic suppression for the global
-    register declarations so the caller's -Wvolatile-register-var state is
-    restored). (yqtian-se)
-  . Fixed OSS-Fuzz #538730793 (Assertion failure when returning by-ref from
-    closure invoke). (ndossche)
-  . Fixed OSS-Fuzz #540904105 (ASSERT: ast->attr == T_CLASS_C). (ndossche)
-
-- CLI
-  . Fix GH-22567 (Windows ZTS CLI SAPI should refresh its TSRMLS cache during
-    request activation). (matyhtf)
-
-- Date:
-  . Fix unserialization of Time\Duration. (timwolla)
-  . Add comparison handler for Time\Duration. (timwolla)
-
-- DOM:
-  . Fixed use-after-free when re-constructing a DOMXPath whose php:function
-    registrations are freed while still reachable from the cycle collector.
-    (Ilia Alshanetsky)
-  . Fixed Dom\HTMLDocument::getElementById() not finding ids of SVG and
-    MathML elements. (Ilia Alshanetsky)
-  . Fixed Dom\HTMLDocument giving attributes the namespace of their element
-    when a fragment is parsed with an xlink, xml or xmlns context element.
-    (Ilia Alshanetsky)
-
-- Fileinfo:
-  . Upgrade to file 5.48. (Weilin Du)
-
-- Intl:
-  . Fixed cloning IntlDateFormatter and MessageFormatter losing PHP-side state
-    such as dateType, timeType, calendar and the message pattern.
-    (Ilia Alshanetsky)
-  . Fixed a crash when converting with a cloned UConverter that uses
-    toUCallback/fromUCallback. (Ilia Alshanetsky)
-
-- Lexbor:
-  . Merge patches lexbor/lexbor@8a14bc0 and lexbor/lexbor@f67ce4b, fixing a
-    heap buffer overflow in :lexbor-contains() parsing and buffer overflows
-    in malformed decode replay. (alexandre-daubois)
-
-- MBString:
-  . Fixed bug GH-23106 (mb_strpos() reads past the end of a haystack ending in
-    a truncated UTF-8 sequence). (Lazizbek Ergashev)
-  . Updated Unicode data tables to Unicode 18.0 (Yuya Hamada)
-
-- MySQLi:
-  . Fix GH-22854: Fixed failed assertion when accessing mysqli property after
-    failed reconnection. (Kamil Tekiela)
-
-- Opcache:
-  . Fixed bug GH-23693 (Tracing JIT produces wrong results for a guard on a
-    loop-invariant addition). (Ilia Alshanetsky)
-  . Fixed OSS-Fuzz #545352966 (default value AST of an SHM-persisted partial).
-    (ndossche)
-
-- PDO:
-  . Fixed PDOStatement::getColumnMeta() reading out of bounds for an invalid
-    column index. (Ilia Alshanetsky)
-  . Fixed PDOStatement::bindColumn() registering a binding for a column name
-    that is not in the result set. (Ilia Alshanetsky)
-
-- PGSQL:
-  . Fixed pg_lo_write() rejecting data containing null bytes. (Ilia Alshanetsky)
-
-- Posix:
-  . Reverted the validity check on the flags argument of posix_access().
-    (David Carlier)
-
-- Readline:
-  . Fixed a heap over-read in the interactive shell prompt when cli.prompt is
-    set to an empty string. (Ilia Alshanetsky)
-
-- SPL:
-  . Fixed bug GH-23385 (SplDoublyLinkedList::serialize() use-after-free when
-    __serialize() removes an element). (David Carlier)
-
-- SQLite:
-  . Fixed a crash when SQLite3::close() is called from a userland callback.
-    (Ilia Alshanetsky)
-
-- Standard:
-  . Fixed bug #60110 (fclose(), file_put_contents(), copy() do not return false
-    properly). (Jakub Zelenka, Ilija Tovilo)
-  . Fixed three Windows-only proc_open() defects: an uninitialized
-    PROCESS_INFORMATION, an indeterminate comspec pointer after a failed
-    lookup, and an unchecked CreateFileA() failure. (Ilia Alshanetsky)
-
-- Zlib:
-  . Fixed inflate_init() dropping the preset dictionary for raw streams with
-    a non-default window. (Ilia Alshanetsky)
-
-
-10 Sep 2026, PHP 8.6.0beta3
-
-- BCMath:
-  . Fixed out-of-bounds read in bc_is_zero_for_scale() when scale exceeds
-    n_scale. (Ilia Alshanetsky)
-
-- Core:
-  . Fixed out-of-bounds reads during automatic UTF-16/32 encoding detection.
-    (Yudai Takada)
-  . Calling is_a() or is_subclass_of() with a string as the first argument
-    when $allow_string is false is now deprecated. (Daniel Scherzer)
-  . Fixed bug GH-23232 (lone namespace separator asks the autoloader for an
-    empty class name). (spawnia)
-  . Enabled the TAILCALL VM (--disable-gcc-global-regs) when building with GCC >= 16.
-    (henderkes)
-
-- CLI:
-  . Fixed bug GH-23242 (PHP development server does not support Expect
-    100-continue flow control). (Sjoerd Langkemper)
-
-- Calendar:
-  . Fixed *tojd() functions and cal_to_jd() truncating arguments outside the
-    int range instead of rejecting them. (lacatoire)
-
-- DOM:
-  . Fixed NamedNodeMap::getNamedItemNS() with an empty URI not matching
-    the null namespace in spec-following mode. (Ilia Alshanetsky)
-  . Fixed stale getElementsByClassName() and other node list caches after
-    className/classList writes and attribute removals. (Ilia Alshanetsky)
-  . Fixed reference cycles through DOMXPath and XSLTProcessor php:function
-    callback arguments and return values not being collectable.
-    (Ilia Alshanetsky)
-
-- Hash:
-  . Fixed hash_file() reporting argument #1 ($algo) instead of argument #2
-    ($filename) when the filename contains null bytes. (lacatoire)
-
-- Intl:
-  . Fixed grapheme_strpos() and grapheme_strrpos() with an empty needle
-    returning UTF-16 offsets instead of grapheme offsets. (Ilia Alshanetsky)
-  . Fixed a memory leak when dumping IntlCalendar instances. (Ilia Alshanetsky)
-  . Fixed Collator::sortWithSortKeys() allocating fixed 2MiB buffers
-    regardless of array size. (Ilia Alshanetsky)
-  . Fixed a memory leak when iterating IntlBreakIterator::getPartsIterator()
-    results. (iliaal)
-  . Fixed a leak in Locale::getKeywords() when a keyword value cannot be
-    read. (iliaal)
-  . Fixed a use-after-free when IntlRuleBasedBreakIterator is constructed
-    from compiled rules. (iliaal)
-  . Fixed Spoofchecker methods not recording the ICU error code when an ICU
-    call fails. (Ilia Alshanetsky)
-  . Fixed idn_to_ascii() and idn_to_utf8() reporting argument #2 ($flags)
-    instead of argument #3 ($variant) for an invalid IDNA variant, and the
-    domain length error message printing a literal "d" instead of the limit.
-    (lacatoire)
-
-- MBString:
-  . Fixed mb_ereg_replace() emitting a NUL or out-of-bounds bytes in the
-    replacement when a \k<name> backref has no closing delimiter.
-    (Ilia Alshanetsky)
-
-- ODBC:
-  . Fixed odbc_field_len(), odbc_field_scale() and odbc_field_type()
-    returning uninitialized memory when SQLColAttribute fails.
-    (Ilia Alshanetsky)
-  . odbc_error() and odbc_errormsg() now also report SQLColAttribute
-    failures. (Ilia Alshanetsky)
-
-- PCNTL:
-  . Fixed the declared signature of pcntl_signal(), whose $restart_syscalls
-    argument accepts null and defaults to it. (lacatoire)
-
-- PDO_PGSQL:
-  . Added Pdo\Pgsql::ATTR_CHUNK_SIZE to fetch a result set in chunks of the
-    given number of rows. (KentarouTakeda)
-
-- PGSQL:
-  . Fixed the pg_insert(), pg_update() and pg_delete() flag error messages,
-    which did not name the set of flags actually accepted. (lacatoire)
-
-- Phar:
-  . Fixed bug GH-23418 (Use-after-free when looking up mounted directories).
-    (Weilin Du)
-  . Fixed bug GH-23477 (Memory leak on duplicate native Phar manifest entries).
-    (Weilin Du)
-
-- Sockets:
-  . Fixed socket_set_option() with SO_ATTACH_REUSEPORT_CBPF and a zero value,
-    which detached the classic BPF filter instead of the reuseport program.
-    (David Carlier)
-
-- SOAP:
-  . Fixed WSDL cache corruption when a soap:header defines headerfaults.
-    (Ilia Alshanetsky)
-  . Fixed stack overflow when parsing a WSDL with self-referential schema
-    groups or attributeGroups. (Ilia Alshanetsky)
-
-- Sodium:
-  . Added support for the libsodium 1.0.22 KEM APIs (X-Wing and ML-KEM768).
-    (Zachary DuBois)
-
-- Standard:
-  . Fixed a segfault when a stream filter callback unsets StreamBucket::$data
-    before re-attaching the bucket. (iliaal)
-  . Fixed an out-of-bounds read when following a redirect response with an
-    empty Location header. (iliaal)
-  . Fixed read buffer compaction in php_stream_filter_flush(). (crystarm)
-  . Io\Poll\Context::wait() now rejects a $maxEvents value greater than
-    INT_MAX instead of truncating it. (marc-mabe)
-  . Fixed GH-23338 (fsockopen()/pfsockopen() ValueError reported wrong
-    argument number for $timeout). (lacatoire)
-  . Fixed bug GH-23576 (Next index for array returned from array_keys() is
-    wrong). (Lazizbek Ergashev)
-
-- SimpleXML:
-  . Fixed writing to a dimension of the object returned by attributes() not
-    creating the attribute. (Ilia Alshanetsky)
-  . Fixed child elements of the element returned by
-    SimpleXMLElement::addChild() not being accessible by property name when
-    namespaces are involved. (Ilia Alshanetsky)
-
-- Streams:
-  . Added so_rcvbuf and so_sndbuf stream socket context options, setting the
-    socket receive and send buffer sizes in bytes. (David Carlier)
-
-
-27 Aug 2026, PHP 8.6.0beta2
-
-- Core:
-  . Fixed bug GH-15375 (Nested "yield from" skips items after a valid() or
-    next() call on the inner generator). (iliaal)
-  . Fixed GH-10497 (Allow direct mutation of objects stored in constants or
-    class constants via OBJ->prop = $val). (Khaled Alam)
-  . Reverted GH-22833, which attempted to fix bug GH-18985. (ilutov)
-  . Using the return statement in a finally block is now deprecated.
-    (aldemeery)
-
-- Curl:
-  . Set content length using CURLOPT_POSTFIELDSIZE_LARGE instead of
-    CURLOPT_POSTFIELDSIZE. This makes it possible to post strings larger than
-    2GB on some platforms, e.g. Windows. (Sjoerd Langkemper)
-
-- DOM:
-  . Fixed a typo in the DOMException message for INUSE_ATTRIBUTE_ERR.
-    (Weilin Du)
-  . Fixed bug GH-22624 (use-after-free via DOMNameSpaceNode after
-    DOMDocument::xinclude()). (David Carlier)
-  . Fixed a use-after-free when cloning a DOMNameSpaceNode after
-    DOMDocument::xinclude(). (iliaal)
-  . Fixed a crash in DOMXPath when a php:function callback receives a nodeset
-    and a later callback returns a node from another document. (iliaal)
-  . Fixed bug GH-23331 (UAF when node_list_unlink() skips attribute children
-    that still have a live wrapper). (iliaal)
-  . Fixed a use-after-free when Dom\Element::setAttributeNS() replaces the
-    value of an attribute whose child still has a live wrapper. (iliaal)
-
-- GD:
-  . Fixed imageaffinematrixget() and imageaffinematrixconcat() reporting the
-    wrong argument in error messages. (Weilin Du)
-  . Fixed imageaffinematrixget() to enforce the documented array|float type
-    for the $options parameter. (Weilin Du)
-
-- Intl:
-  . Fixed grapheme_strrev() treating UBRK_DONE as a byte index and leaving
-    the result without a terminating NUL. (iliaal)
-  . Fixed a double-free when IntlGregorianCalendar construction fails after
-    the ICU constructor adopts the TimeZone. (iliaal)
-  . Fixed bug GH-23094 (NumberFormatter parsing offsets use UTF-16 positions
-    for UTF-8 strings). (ColumbusLabs)
-  . Fixed Locale::parseLocale() reading past a trailing '-' or '_'.
-    (iliaal, Xuyang Zhang)
-  . Fixed grapheme_str_split() treating UBRK_DONE as a byte index. (iliaal)
-
-- Opcache:
-  . Fixed a tracing JIT crash when compiling a side trace for a method of a
-    class that could not be stored in the inheritance cache. (GH-21710)
-    (Arnaud, iliaal)
-
-- PDO:
-  . Fixed a leak when a persistent connection failed a liveness check
-    with no other live PDO handle. (iliaal)
-
-- PDO_PGSQL:
-  . Fixed several lazy fetch (PDO::ATTR_PREFETCH => 0) defects: an infinite
-    loop when cleaning up a fetch left in a COPY, a use-after-free when a
-    statement with emulated or disabled prepares is destroyed, a connection
-    left busy for the next fetch, and rows delivered from a result another
-    statement took over. (KentarouTakeda)
-
-- PGSQL:
-  . Fixed the class name casing of pg_close_stmt()'s connection parameter.
-    (lacatoire)
-
-- Phar:
-  . Fixed Phar archives being automatically detected when ".phar" only occurs
-    in a directory name or is not a filename extension in an included file's
-    path. (Weilin Du)
-
-- Readline:
-  . Fixed class constant completion in the interactive shell. (Weilin Du)
-
-- Zip:
-  . Fixed bug GH-23276 (ZipArchive subclass storing its own stream cannot be
-    garbage collected). (Weilin Du, ndossche)
-
-- SAPI:
-  . Fixed fuzzer targets failing to build in isolation. (Mrmaxmeier)
-  . Fixed returns uninitialized value on LiteSpeed lsapi SAPI (Go Kudo)
-
-- Session:
-  . Fixed bug GH-23056 (missing handler name in session write warning).
-    (lazerg)
-  . SessionHandler::validateId() is now implemented, so
-    session.use_strict_mode applies to the built-in handler. (Girgias)
-  . It is now deprecated to pass an object that does not implement the
-    create_sid() and validateId() methods. (Girgias)
-  . A deprecation is now emitted when implementing SessionHandlerInterface on a
-    class which doesn't define the create_sid() or validateId() methods, as
-    those will be moved from SessionUpdateTimestampHandlerInterface and
-    SessionIdInterface to SessionHandlerInterface. (Girgias)
-
-- SNMP:
-  . It is now possible to use the AES192, AES192C, AES256, and AES256C as
-    SNMPv3 security protocols if the underlying library supports them.
-    (eskyuu)
-  . It is now possible to reset the MIB tree using the new snmp_init_mib()
-    function. (eskyuu)
-  . Additional MIB parsing and output control functionality has been exposed
-    via the snmp_set_mib_option(), snmp_set_output_option(),
-    snmp_set_string_output_format() functions, the $numeric_index,
-    $numeric_timeticks, $extended_index, $dont_print_units, $escape_quotes,
-    $print_hex_text SNMP properties, and the SNMP::setOidOutputFormat(),
-    SNMP::setStringOutputFormat() methods. (eskyuu)
-
-- Sodium:
-  . Fixed incorrect parameter name in sodium_add(), sodium_memcmp(), and
-    sodium_compare() length-mismatch error messages. (lacatoire)
-
-- SPL:
-  . The following SplFileObject methods have been deprecated
-    SplFileObject::fgetcsv(), SplFileObject::fputcsv(),
-    SplFileObject::setCsvControl(), and SplFileObject::getCsvControl().
-    (Girgias)
-
-- Standard:
-  . Fixed incorrect parameter name in convert_uudecode() warning. (lacatoire)
-  . Added support for the "<" and ">" endianness modifiers in pack() and
-    unpack() format codes. (alexandre-daubois)
-
-- Zip:
-  . Fixed bug GH-17787 (ZipArchive stream stops reading early when the archive
-    is freed while the stream is still open). (Eyüp Can Akman)
-
-- Zlib:
-  . Fixed bug GH-22142 (Assertion failure in deflate_init() when an option
-    object has uninitialised typed properties). (David Carlier)
-
-13 Aug 2026, PHP 8.6.0beta1
-
-- Core:
-  . Deprecated "namespace" as a class constant name. (NickSdot)
-  . Changed run-tests.php to run in parallel by default, using up to 10
-    automatically detected workers. Pass -j1 for sequential execution.
-    (NickSdot)
-  . Allowed readonly properties to declare default values. (NickSdot)
-  . Changed run-tests.php to run test subprocesses without a shell where
-    possible. (NickSdot)
-  . Fixed GH-23083 (SEGV build_trace_args in zend_exceptions.c with
-    -d error_include_args=On). (David Carlier)
-  . Fixed GH-23121 (is_callable() wrongly accepts objects with no get_closure
-    handler). (David Carlier)
-  . Passing a 3rd argument to define() is now deprecated. (Girgias)
-  . Naming a function readonly is now deprecated. (Girgias)
-  . Added stateless closure cache. (ilutov)
-
-- BZ2:
-  . Passing an object for the Bzip2 {de}compression stream filter is now
-    deprecated. Use get_object_vars() on the object instead. (Girgias)
-
-- Curl:
-  . Improved cURL option validation errors to include the option name.
-    (Sjoerd Langkemper)
-  . Raise a value error when the callback registered with CURLOPT_READFUNCTION
-    returns an unexpected long. (Sjoerd Langkemper)
-  . Fix bug GH-16513 (curl: exceptions in callbacks do not abort the request).
-    (Sjoerd Langkemper)
-
-- Date:
-  . Update timelib to 2026.02. (Derick, timwolla)
-  . Added Time\Duration. (timwolla, Derick)
-
-- DOM:
-  . Fixed bug GH-23116 (Stack overflow when normalizing a deeply nested
-    DOMDocument). (Lazizbek Ergashev)
-  . Fixed bug GH-23117 (Stack overflow when normalizing a deeply nested
-    Dom\XMLDocument). (Lazizbek Ergashev)
-
-- Exif:
-  . Fixed exif_read_data() allocating a HEIF meta box larger than the file
-    it came from. (iliaal)
-
-- GMP:
-  . Added optional $definitely_prime output parameter to gmp_prevprime().
-    (Weilin Du)
-  . Added gmp_powm_sec(). (Weilin Du)
-
-- Intl:
-  . Added static methods IntlDatePatternGenerator::getSkeleton() and
-    IntlDatePatternGenerator::getBaseSkeleton(). (Weilin Du)
-  . Fixed Collator::sort(), collator_sort(), Collator::asort(), and
-    collator_asort() to report UTF-8/UTF-16 conversion errors through the intl
-    error handler instead of emitting a warning and continuing with an empty
-    string. (Weilin Du)
-  . Fixed IntlListFormatter::__construct() leaving stale global error state
-    after successful calls. (Weilin Du)
-  . Fixed IntlNumberRangeFormatter leaving stale global error state after
-    successful createFromSkeleton() and format() calls. (Weilin Du)
-  . Implemented GH-20255 (Add a predefined calendar constant in
-    IntlDateFormatter for the proleptic gregorian calendar). (David Carlier)
-  . Added SpoofChecker::areBidiConfusable(). (David Carlier)
-  . Added SpoofChecker::getBidiSkeleton(). (Weilin Du)
-  . Added SpoofChecker::getSkeleton(). (David Carlier)
-  . Fixed IntlNumberRangeFormatter::format() crash when the formatting fails.
-    (David Carlier)
-
-- MbString:
-  . Passing objects to mb_convert_variables() is now deprecated. (Girgias)
-
-- MySQLi:
-  . The mysqli_get_charset() function and mysqli::get_charset() method are now deprecated. (Kamil Tekiela)
-  . The mysqli_stmt_init() function and mysqli::stmt_init() method are now deprecated. (Kamil Tekiela)
-  . Instantiation of mysqli_stmt without providing the $query parameter is now deprecated. (Kamil Tekiela)
-
-- PDO:
-  . Fixed pdo_raise_impl_error() emitting a warning under ERRMODE_SILENT.
-    (iliaal)
-
-- PDO_ODBC:
-  . Fixed bug GH-23016 (NULL values in long columns come back as garbage
-    binary strings). (Calvin Buckley, iliaal)
-
-- Readline:
-  . Fixed the interactive shell not waiting for the pager process to exit.
-    (Weilin Du)
-
-- Reflection:
-  . Added ReflectionAttribute::inNamespace(),
-    ReflectionAttribute::getNamespaceName(), and
-    ReflectionAttribute::getShortName(). (Girgias)
-  . Fixed bug GH-22905 (Reflection exception messages truncate on null bytes).
-    (DanielEScherzer)
-  . Fixed ReflectionProperty::isLazy() and skipLazyInitialization() using the
-    parent slot when a child class hooks an inherited property. (iliaal)
-  . Fixed segfault in ReflectionMethod::createFromMethodName() on an
-    uninstantiable subclass. (iliaal)
-
-- SimpleXML:
-  . Fixed integer element offsets that cannot resolve aliasing an existing
-    element. (iliaal)
-  . SimpleXMLElement::__construct() now raises a ValueError when the $data
-    argument contains NUL bytes. (iliaal)
-  . Fixed segfault when comparing uninitialized SimpleXMLElement
-    instances. (iliaal)
-
-- SPL:
-  . The spl_classes() function is now deprecated, use
-    ReflectionExtension::getClassNames() instead. (Girgias)
-  . The spl_object_hash() function is now deprecated, use spl_object_id()
-    instead. (Girgias)
-  . The following ArrayIterator methods are now deprecated:
-    * ArrayIterator::getFlags()
-    * ArrayIterator::setFlags()
-    * ArrayIterator::asort()
-    * ArrayIterator::ksort()
-    * ArrayIterator::uasort()
-    * ArrayIterator::uksort()
-    * ArrayIterator::natsort()
-    * ArrayIterator::natcasesort()
-    * ArrayIterator::unserialize()
-    * ArrayIterator::serialize()
-    (Girgias)
-
-- Standard:
-  . Passing an object as the $data argument to http_build_query() is now
-    deprecated. The interpretation of object values within $data as arrays
-    is also deprecated. Convert objects to arrays with get_object_vars()
-    before calling the function. (Girgias)
-  . Added the "filter.max_filter_count" stream context option for php://filter
-    URLs. Using more than 16 filters without configuring this option is now
-    deprecated. (Sjoerd Langkemper)
-  . The metaphone() function is now deprecated, use a userland phonetic
-    matching library instead. (Weilin Du)
-  . Improved performance of array_intersect(). (mehmetcansahin)
-  . Fixed bug GH-23006 (phpcredits() full-page HTML title says phpinfo()).
-    (Weilin Du)
-  . The following functions now raise a ValueError when the $filename argument
-    contains NUL bytes: fileperms(), fileinode(), filesize(), fileowner(),
-    filegroup(), fileatime(), filemtime(), filectime(), filetype(),
-    is_writable(), is_readable(), is_executable(), is_file(), is_dir(),
-    is_link(), file_exists(), lstat(), stat(). (Girgias)
-  . Fixed bug GH-22818 (stream_filter_register() orphaned user_filter_map on
-    shutdown re-registration). (David Carlier)
-  . Io\Poll\Context::wait() now takes a Time\Duration object as a timeout.
-    (timwolla)
-  . Passing an object to array_walk{_recursive} is now deprecated. Use
-    get_object_vars() on the object instead. (Girgias)
-  . The is_double() function is now deprecated, use is_float() instead.
-    (Girgias)
-  . The is_long() and is_integer() functions are now deprecated, use is_int()
-    instead. (Girgias)
-  . The doubleval() function is now deprecated, use floatval() instead.
-    (Girgias)
-  . The strcoll() function is now deprecated, use Collator::compare() instead.
-    (Girgias)
-  . The SORT_LOCALE_STRING constant for the family of sort functions is now
-    deprecated, use one of the following functions instead:
-    * Collator::asort()
-    * Collator::sort()
-    * Collator::sortWithSortKeys()
-    (Girgias)
-
-- Streams:
-  . Fixed file_put_contents() LOCK_EX early return leaking stream error
-    operation depth. (iliaal)
-
-- XSL:
-  . Fixed use-after-free when a DOMDocument subclass __clone() retains the
-    stylesheet copy made by XSLTProcessor::importStylesheet(). (iliaal)
-
-- Zlib
-  . Passing an object for the zlib deflate and inflate stream filter is now
-    deprecated. Use get_object_vars() on the object instead. (Girgias)
-  . Passing an object to the $option argument to deflate_init and inflate_init
-    is now deprecated. Use get_object_vars() on the object instead. (Girgias)
-
-30 Jul 2026, PHP 8.6.0alpha3
-
-- Core:
-  . Implemented partial function application RFC. (Arnaud)
-  . Fixed bug GH-22263 (reset typed property default on every unserialize
-    failure path). (David Carlier)
-  . Fixed bug GH-18985 (Wrong line numbers for match with constant arms).
-    (ilutov)
-  . Fixed bug GH-18847 (SEGV in zend_fetch_debug_backtrace() when the memory
-    limit is reached while the tracing JIT enters a call frame). (Arnaud,
-    iliaal)
-
-- DOM:
-  . Fixed bug GH-22825 (DOMElement::setAttribute() fails silently when the DTD
-    declares a default value for the attribute). (iliaal)
-  . Fixed bug GH-23120 (Stack overflow when comparing deeply nested DOM nodes
-    with DOMNode::isEqualNode()). (Weilin Du)
-
-- Embed:
-  . Made php-cli functionality available in embed builds. (henderkes)
-
-- GMP:
-  . Added gmp_prevprime(). (Weilin Du, David Carlier)
-  . Fixed GMP power and shift operators to reject GMP right operands outside
-    the unsigned long range instead of silently truncating them. (Weilin Du)
-  . Fixed GMP integer string parsing to reject strings containing NUL bytes
-    instead of silently truncating them. (Weilin Du)
-  . Fixed GMP error messages that referenced outdated parameter names.
-    (Weilin Du)
-
-- Intl:
-  . Fixed grammatical issues in Normalizer invalid form and IntlCalendar time
-    zone offset error messages. (Weilin Du)
-  . Removed the dependency on the ICU IO library. (Weilin Du)
-
-- ODBC:
-  . Fixed bug GH-22668 (Heap buffer over-read when a column value exceeds the
-    driver-reported display size). (iliaal)
-
-- Opcache:
-  . Re-enable JIT for ZTS builds on Apple Silicon. (realFlowControl)
-
-- PDO_ODBC:
-  . Fixed bug GH-22667 (Heap buffer over-read when a column value exceeds the
-    driver-reported display size). (iliaal)
-  . Fixed bug GH-22666 (Heap buffer overflow when an output parameter value is
-    longer than the declared maxlen). (iliaal)
-  . Fixed bug GH-22665 (Out-of-bounds write when the ODBC driver reports a
-    diagnostic message length beyond the error buffer). (iliaal)
-
-- Phar:
-  . Fixed grammatical issues and outdated terminology in Phar error messages.
-    (Weilin Du)
-
-- Reflection:
-  . Fixed bug GH-22681 (Reflection*::__toString() truncates on null bytes).
-    (DanielEScherzer)
-
-- SOAP:
-  . Fixed header injection through the Content-Type context option, the
-    soapaction and the cookie names and values. (David Carlier)
-  . Fixed the SoapClient and SoapServer "classmap" option to reject arrays
-    containing integer keys, and made SoapClient throw TypeError/ValueError
-    for invalid "classmap" options. (Weilin Du, David Carlier)
-
-- MBString:
-  . Fixed bug GH-22779 (mb_strrpos() returns the wrong position for a negative
-    offset in a non-UTF-8 encoding). (Eyüp Can Akman)
-  . Fixed bug GH-21036 (mb_ereg_search_getregs() crashes after mb_eregi()
-    invalidates the regex cache). (Matthias Goergens)
-
-- PCRE:
-  . Fixed bug GH-21134 (Crash with \C + UTF-8). Using \C in UTF-8 patterns is
-    now forbidden. (Arnaud)
-
-- Sockets:
-  . Fixed socket_set_option() validation error messages for UDP_SEGMENT and
-    TCP_USER_TIMEOUT, and SO_LINGER options. (Weilin Du)
-  . Fixed various memory related issues in ext/sockets. (David Carlier)
-
-- Standard:
-  . Fixed setlocale() to reject locale names containing NUL bytes instead of
-    silently truncating them, and to reject arrays passed after the $locales
-    argument or additional arguments passed after an array $locales argument.
-    (Weilin Du)
-
-- Streams:
-  . Added a new IO copy API used by php_stream_copy_to_stream_ex() that
-    leverages platform primitives (sendfile, splice, copy_file_range,
-    TransmitFile) for faster stream copying. (Jakub Zelenka, David Carlier)
-  . Fixed bug GH-22841 (php_stream_copy_to_stream_ex() drops progress
-    notifications when using the copy fast path). (David Carlier)
-  . Fixed bug GH-15836 (Use-after-free when a user stream filter accesses
-    $this->stream during the close flush). (iliaal)
-
-16 Jul 2026, PHP 8.6.0alpha2
-
-- Core:
-  . Sync Boost.Context assembly with 1.91.0. (kn1g78)
-  . Fixed bug GH-22387 (AST pretty-printing drops meaningful parentheses around
-    RHS of instanceof). (timwolla)
-  . Fixed bug GH-15672 and GH-15911 (Stack overflow when an internal function
-    recurses through zend_call_function, such as a self-attached SPL
-    iterator). (iliaal)
-  . Lock unmodified readonly properties for modification after clone-with.
-    (NickSdot)
-  . abort() instead of exit() on hard OOM. (realFlowControl)
-  . perf: ZTS: move AG and SCNG into native __thread storage. (henderkes)
-
-- Calendar:
-  . Fixed bug GH-22602 (gregoriantojd() and juliantojd() integer overflow with
-    INT_MAX year). (arshidkv12)
-
-- Curl:
-  . Added CURLOPT_SEEKFUNCTION and the CURL_SEEKFUNC_OK, CURL_SEEKFUNC_FAIL
-    and CURL_SEEKFUNC_CANTSEEK constants, letting libcurl rewind a streamed
-    request body to resend it on a redirect, multi-pass authentication or a
-    retried reused connection. (GrahamCampbell)
-
-- Date:
-  . Update timelib to 2022.17. (Derick)
-  . Fixed bug GH-19803 (Parsing a string with a single white space does create
-    an error). (Derick)
-  . Fixed Unix timestamps in February of the year 0 are misparsed with
-    @-notation. (LukasGelbmann)
-  . Fixed bug GH-11368 (idate() doesn't work for the year -1). (Derick)
-  . Fixed bug GH-11310 (__debugInfo does nothing on userland classes extending
-    Date classes). (Derick)
-
-- DBA:
-  . Fixed OOB read on malformed length field in dba flatfile handler. (alhudz)
-
-- DOM:
-  . Fixed bug GH-22570 (Stack overflow when serializing a deeply nested
-    Dom\XMLDocument). (iliaal)
-  . Fixed Dom\DtdNamedNodeMap integer dimension access so negative indexes
-    return NULL and indexes outside the int range throw ValueError instead of
-    returning the first entity or notation. (Weilin Du)
-  . Fixed bug GH-22623 (use after free with namespace nodes from
-    XSLTProcessor::registerFunctions())/ (David Carlier)
-  . Fixed bug GH-22554 (use-after-free with XPath callback returning a node
-    from a foreign document). (David Carlier)
-
-- Exif:
-  . Fixed bug GH-11020 (exif_read_data() emits a spurious "Illegal IFD size"
-    warning when an IFD is not followed by a next-IFD offset). (Eyüp Can Akman)
-
-- GMP:
-  . Fixed bug GH-22549 (Assertion failure / UB on a compound GMP power or shift
-    assignment with a negative exponent). (iliaal)
-
-- Intl:
-  . Fixed NumberFormatter::parse() and NumberFormatter::parseCurrency() to
-    reject offset values outside the 32-bit range instead of silently
-    truncating them. (Weilin Du)
-  . IntlDateFormatter::parse()/datefmt_parse() and
-    IntlDateFormatter::localtime()/datefmt_localtime() now raise TypeError
-    when the offset argument is not of type int. (Weilin Du)
-
-- JSON:
-  . Report unterminated JSON strings as syntax errors. (timwolla)
-  . Improve performance error position tracking during JSON decoding.
-    (henderkes)
-  . Fixed bug GH-22514 (Incorrect error column in PHP 8.6 JSON parser).
-    (henderkes, timwolla)
-
-- Opcache:
-  . Fixed bug GH-21770 (Infinite recursion in property hook getter in opcache
-    preloaded trait). (iliaal)
-
-- OpenSSL:
-  . Added $salt_length parameter to openssl_sign() and openssl_verify() with
-    new OPENSSL_RSA_PSS_SALTLEN_* constants. (Jakub Zelenka)
-  . Fixed timeout for supplemental read at end of a blocking stream in SSL
-    stream wrapper. (ilutov)
-  . Fixed stream_socket_get_crypto_status() after supplemental read. (ilutov)
-
-- PDO_ODBC:
-  . Fixed bug GH-20726 (Crash with ODBC connection pooling when the DSN
-    carries no credentials). (iliaal)
-
-- PHPDBG:
-  . Fixed fleaked lowercased lookup keys in phpdbg_resolve_opline_break.
-    (jorgsowa)
-  . Fixed off-by-one in phpdbg_safe_class_lookup() causing class lookups to
-    always fail during phpdbg's signal-safe interruption path. (jorgsowa)
-
-- Reflection:
-  . Fixed bug GH-22683 (Reflection(Class)Constant::__toString() should not warn
-    on NAN conversions). (Khaled Alam)
-  . Fixed bug GH-22681 (Reflection*::__toString() truncates on null bytes).
-    (DanielEScherzer)
-
-- Session:
-  . Fixed bug GH-21314 (Different session garbage collector behavior between
-    PHP 8.3 and PHP 8.5). (jorgsowa)
-
-- SOAP:
-  . Fixed bug GH-22585 (OOM on bailout with uninitialized
-    do_request() parameters). (David Carlier)
-  . Fixed xsd:hexBinary decoding to reject odd-length values instead of
-    silently truncating the last nibble. (Weilin Du)
-  . Made SOAP encoding errors report the affected type or failing operation
-    instead of the generic "Violation of encoding rules" message. (Weilin Du)
-
-- Standard:
-  . Fixed sleep() and usleep() to reject values that overflow the underlying
-    unsigned int timeout. (Weilin Du)
-  . Fixed bug GH-22671 (assert.bail aborts the process when the assert callback
-    throws an exception whose reporting re-throws). (iliaal)
-  . Fixed bug GH-22678 (Use-after-free in array_multisort() when the comparator
-    mutates the array being sorted). (azchin, iliaal)
-
-- Streams:
-  . Fixed bug GH-21468 (Segfault in file_get_contents w/ a https URL
-    and a proxy set). (CVE-2026-12184) (ndossche)
-
-- URI:
-  . Fixed bug GH-22628 (Percent-encoding of caret in WHATWG URL paths is not
-    performed). (kocsismate)
-  . Fixed bug GH-22629 (WHATWG Validation error incorrect with empty host and
-    non-empty userinfo). (kocsismate)
-
-- Zip:
-  . Fixed bug GH-22649 (ZipArchive::setCommentName() and setCommentIndex()
-    could crash after overwriting an entry and resetting its inherited
-    unchanged comment). (Weilin Du)
-  . Fixed bug GH-21705 (ZipArchive::getFromIndex() ignores
-    ZipArchive::FL_UNCHANGED for deleted entries). (Weilin Du)
-  . Fixed bug GH-22176 (memory leak with ZipArchive::registerCancelBack()
-    is used with reference returning function during shutdown).
-    (David Carlier)
-  . ZipArchive::addGlob() and ZipArchive::addPattern() now raise a TypeError
-    for invalid "remove_all_path", "comp_method", "comp_flags", and
-    "enc_method" options instead of emitting a warning. (David Carlier)
-
-02 Jul 2026, PHP 8.6.0alpha1
-
-- Core:
-  . Added first-class callable cache to share instances for the duration of the
-    request. (ilutov)
-  . It is now possible to use reference assign on WeakMap without the key
-    needing to be present beforehand. (ndossche)
-  . Added `clamp()`. (kylekatarnls, thinkverse)
-  . Fix OSS-Fuzz #429429090 (Failed assertion on unset() with uninitialized
-    container). (ilutov)
-  . Fixed GH-20564 (Don't call autoloaders with pending exception). (ilutov)
-  . Fix deprecation not showing when accessing null key of an array with JIT.
-    (alexandre-daubois)
-  . Fixed bug GH-20174 (Assertion failure in
-    ReflectionProperty::skipLazyInitialization after failed LazyProxy
-    initialization). (Arnaud)
-  . Enabled the TAILCALL VM on Windows when compiling with Clang >= 19 x86_64.
-    (henderkes)
-  . Deprecate specifying a nullable return type for __debugInfo(). (timwolla)
-  . Fixed bug GH-22142 (Assertion failure in zendi_try_get_long() on IS_UNDEF).
-    (David Carlier)
-  . Fixed bug GH-22046 (The unserialize function can lead to segfault when
-    non-Serializable internal classes are serialized back with the C format).
-    (kocsismate)
-  . Fixed bug GH-22292 (AST pretty printing does not correctly handle invalid
-    variable names). (timwolla)
-  . Fixed bug GH-22291 (AST pretty printing does not correctly handle braces in
-    string interpolation). (timwolla)
-  . Fixed bug GH-22373 (AST pretty-printing drops meaningful parentheses
-    surrounding property access). (timwolla)
-  . Fixed GH-22422 (zend_arena layout mismatch leaked memory in separately
-    built extensions under AddressSanitizer). (iliaal)
-  . TSRM: use local-exec TLS in PIE executables. (henderkes)
-  . perf: make all static extensions use TSRMG_STATIC. (henderkes)
-  . Fixed bug GH-22257 (type confusion in Exception::getTraceAsString()).
-    (David Carlier)
-  . TSRM: make CG, EG, SCNG and AG compile-time offsets. (henderkes)
-  . Deprecate returning values from __construct() and __destruct(). (timwolla)
-  . base_convert, bindex, hexdec and octdec now raise a notice when they cannot
-    precisely convert the given number. (Sjoerd Langkemper)
-  . Added error_include_args INI option to make the display of function
-    arguments consistent in error output. (Calvin Buckley)
-
-- BCMath:
-  . Added NUL-byte validation to BCMath functions. (jorgsowa)
-
-- BZ2:
-  . Reject oversized input in bzdecompress(). (arshidkv12)
-
-- Curl:
-  . Add support for CURLINFO_SIZE_DELIVERED (libcurl >= 8.20.0). (Ayesh)
-
-- Date:
-  . Update timelib to 2022.16. (Derick)
-
-- DOM:
-  . Removed LIBXML_XINCLUDE from valid options for XMLDocument, as it was a
-    no-op. (ndossche)
-  . Readonly DOM properties are now declared with asymmetric visibility
-    (public private(set)). ReflectionProperty::isWritable() reports them
-    correctly, and external writes raise "Cannot modify private(set)
-    property" instead of the previous readonly modification error.
-    (David Carlier)
-  . Fixed Dom\Notation nodes missing tree connection, so that ownerDocument,
-    parentNode, isConnected and baseURI now return correct values, and
-    textContent returns NULL per the DOM specification. (jordikroon)
-
-- EXIF:
-  . Added support for reading EXIF metadata from WebP images (GH-19904).
-    (iliaal)
-
-- Fileinfo:
-  . Fixed bug GH-20679 (finfo_file() doesn't work on remote resources).
-    (ndossche)
-  . Fixed bug #66095 (Hide libmagic dynamic symbols). (orlitzky)
-
-- GD:
-  . imagesetstyle()/imagefilter()/imagecrop() check array argument entries
-    types. (David Carlier)
-
-- GMP:
-  . gmp_fact() reject values larger than unsigned long. (David Carlier)
-  . gmp_pow/binomial/root/rootrem and shift/pow operators reject values larger
-    than unsigned long. (David Carlier)
-  . GMP exponentiation and shift operators now emit a deprecation warning
-    when converting a float right operand to int loses precision. (Weilin Du)
-
-- Hash:
-  . Upgrade xxHash to 0.8.2. (timwolla)
-
-- Intl:
-  . Fixed malformed ResourceBundle::get() error message when fallback is
-    disabled. (Weilin Du)
-  . Added Locale::getDisplayKeyword() and Locale::getDisplayKeywordValue(),
-    with the alias of locale_get_display_keyword() and
-    locale_get_display_keyword_value() respectively. (Weilin Du)
-  . Fix incorrect argument positions for invalid start/end arguments in
-    transliterator_transliterate(). (Weilin Du)
-  . Fixed IntlTimeZone::getDisplayName() to synchronize object error state
-    for invalid display types. (Weilin Du)
-  . Fixed Locale::lookup() and locale_lookup() to return NULL instead of the
-    fallback locale when a language tag cannot be canonicalized. (Weilin Du)
-  . Added IntlNumberRangeFormatter class to format an interval of two numbers
-    with a given skeleton, locale, collapse type and identity fallback.
-    (BogdanUngureanu)
-  . Fixed bug GH-20426 (Spoofchecker::setRestrictionLevel() error message
-    suggests missing constants). (DanielEScherzer)
-  . Added grapheme_strrev (Yuya Hamada)
-  . Passing a non-stringable object as a time zone to Intl time zone
-    argument handling now raises TypeError instead of Error. (Weilin Du)
-  . IntlBreakIterator::getLocale() now raises ValueError for invalid locale
-    types. (Weilin Du)
-  . Fixed MessageFormatter::parse() and parseMessage() returning PHP_INT_MIN
-    as float rather than int on 64-bit platforms. (Weilin Du)
-  . Fixed UConverter::transcode() silently truncating from_subst and to_subst
-    option lengths greater than 127 bytes. (Weilin Du)
-  . Fixed IntlIterator::current() to return NULL instead of an undefined value
-    when the iterator is not positioned on a valid element. (Weilin Du)
-
-- IO:
-  . Added new polling API. (Jakub Zelenka)
-
-- JSON:
-  . Enriched JSON last error / exception message with error location.
-    (Juan Morales)
-
-- Fibers:
-  . Fixed bug GH-20483 (ASAN stack overflow with fiber.stack_size INI small
-    value). (David Carlier)
-
-- Mail:
-  . Fixed bug GH-20862 (null pointer dereference in
-    php_mail_detect_multiple_crlf via error_log (jordikroon)
-
-- Mbstring:
-  . ini_set() with mbstring.detect_order changes the order of mb_detect_order
-    as intended, since mbstring.detect_order is an INI_ALL setting. (tobee94)
-  . Added GB18030-2022 to default encoding list for zh-CN. (HeRaNO)
-  . Fixed bug GH-20836 (Stack overflow in mb_convert_variables with
-    recursive array references). (alexandre-daubois)
-  . Fixed bug GH-21223; mb_guess_encoding no longer crashes when passed huge
-    list of candidate encodings (with 200,000+ entries). (Jordi Kroon)
-  . mbregex has been deprecated. (youkidearitai)
-
-- Mysqli:
-  . Added mysqli_quote_string() and mysqli::quote_string(). (Kamil Tekiela)
-
-- Opcache:
-  . Fixed bug GH-20051 (apache2 shutdowns when restart is requested during
-    preloading). (Arnaud, welcomycozyhom)
-
-- OpenSSL:
-  . Added AES-SIV support. (jordikroon)
-  . Implemented GH-20310 (No critical extension indication in
-    openssl_x509_parse() output). (StephenWall)
-  . Added TLS session resumption support for streams with new context options
-    and Openssl\Session class. (Jakub Zelenka)
-  . Added TLS external PSK support for streams with new context options and
-    Openssl\Psk class. (Jakub Zelenka)
-  . Added TLS 1.3 early data (0-RTT) support for streams with new context
-    options early_data, max_early_data and early_data_cb. (Jakub Zelenka)
-  . Added stream crypto status for exposing OpenSSL WANT_READ / WANT_WRITE.
-    (Jakub Zelenka)
-
-- PCNTL:
-  . pcntl_exec() now throws a ValueError if the $args array is not a list
-    array. (Weilin Du)
-
-- PDO_DBLIB:
-  . Added dblib_handle_check_liveness handler. (freddy77)
-
-- PDO_PGSQL:
-  . Clear session-local state disconnect-equivalent processing.
-    (KentarouTakeda)
-
-- PGSQL:
-  . Enabled 64 bits support for pg_lo_truncate()/pg_lo_tell() if the server
-    supports it. (KentarouTakeda)
-  . pg_fetch_object() now surfaces non-instantiable class errors before
-    fetching, resolves the constructor via the get_constructor handler, and
-    reports the empty-constructor ValueError on the $constructor_args argument.
-    (David Carlier)
-
-- Phar:
-  . Support reference values in Phar::mungServer(). (ndossche)
-  . Invalid values now throw in Phar::mungServer() instead of being silently
-    ignored. (ndossche)
-  . Fixed a bypass of the magic ".phar" directory protection in
-    Phar::addEmptyDir() for paths starting with "/.phar". (Weilin Du)
-  . Fixed an integer underflow when parsing ZIP extra fields. (Weilin Du)
-  . Phar::addEmptyDir() now allows non-magic directory names that merely
-    share the ".phar" prefix. (Weilin Du)
-  . Support overridden methods in SplFileInfo for getMTime() and getPathname()
-    when building a phar. (ndossche)
-  . Mark Phar::buildFromIterator() base directory argument as a path.
-    (ndossche)
-
-- phpdbg:
-  . Fixed GH-22480 (Use-after-free when re-watching an already-watched
-    variable). (iliaal)
-
-- Posix:
-  . Added validity check to the flags argument for posix_access(). (arshidkv12)
-
-- Reflection:
-  . Fixed bug GH-20217 (ReflectionClass::isIterable() incorrectly returns true
-    for classes with property hooks). (alexandre-daubois)
-  . Added ReflectionConstant::inNamespace(). (Khaled Alam)
-  . Added ReflectionProperty::isReadable() and ::isWritable(). (ilutov)
-  . Fixed bug GH-21362 (ReflectionMethod::invoke/invokeArgs() did not verify
-    Closure instance identity for Closure::__invoke()). (Ilia Alshanetsky)
-  . Added ReflectionParameter::getDocComment(). (chschneider)
-
-- Session:
-  . Fixed bug 71162 (updateTimestamp never called when session data is empty).
-    (Girgias)
-  . Null bytes in session.cookie_path, session.cookie_domain, and
-    session.cache_limiter are now rejected with a warning. (jorgsowa)
-  . session.cookie_samesite now rejects invalid values with a warning; only
-    "Strict", "Lax", "None", or "" are accepted. (jorgsowa)
-  . session.cookie_lifetime now rejects non-integer and out-of-range values
-    with a warning. (jorgsowa)
-  . Session file GC now recursively cleans nested subdirectories when
-    session.save_path uses the dirdepth prefix. (jorgsowa)
-  . Changed defaults of session.use_strict_mode (now 1), session.cookie_httponly
-    (now 1) and session.cookie_samesite (now "Lax"). (jorgsowa)
-
-- Shmop:
-  . Fixed bug GH-9945 (shmop_open() silently truncates keys outside the key_t
-    range). (Weilin Du)
-
-- Soap:
-  . Soap::__setCookie() when cookie name is a digit is now not stored and
-    represented as a string anymore but a int. (David Carlier)
-  . Fixed bug GH-21421 (SoapClient typemap property breaks engine assumptions).
-    (ndossche)
-  . WSDL/XML Schema parsing now rejects out-of-range integer values for
-    occurrence constraints and integer restriction facets. Negative minOccurs
-    and maxOccurs values are rejected as well. (Weilin Du)
-
-- Sockets:
-  . Added the TCP_USER_TIMEOUT constant for Linux to set the maximum time in
-    milliseconds transmitted data can remain unacknowledged. (James Lucas)
-  . Added AF_UNSPEC support for sock_addrinfo_lookup() as a sole umbrella for
-    AF_INET* family only. (David Carlier)
-  . Fixed GH-20532 (socket_addrinfo_lookup gives the error code with a new
-    optional parameter). (David Carlier)
-  . Added AF_PACKET support completion for socket_sendto()/socket_recvfrom().
-    (David Carlier)
-
-- Sodium:
-  . Added support for libsodium 1.0.21 IPcrypt and XOF APIs. (jedisct1)
-  . pwhash argument-validation errors now throw ValueError instead of
-    SodiumException. (iliaal)
-
-- SPL:
-  . DirectoryIterator key can now work better with filesystem supporting larger
-    directory indexing. (David Carlier)
-  . Fixed bug GH-21831 (SplObjectStorage::removeAllExcept() use-after-free with
-    re-entrant getHash()). (Pratik Bhujel)
-  . Fix bugs GH-8561, GH-8562, GH-8563, and GH-8564 (Fixing various
-    SplFileObject iterator desync bugs). (iliaal)
-  . Fix bug GH-22062 (SplDoublyLinkedList iterator UAF via destructor releasing
-    next node). (David Carlier)
-
-- Sysvshm:
-  . Fixed shm_attach() to throw ValueError for keys outside the key_t range.
-    (Weilin Du)
-
-- Sqlite3:
-  . Fix NUL byte truncation in sqlite3 TEXT column handling. (ndossche)
-
-- Standard:
-  . Fixed bug GH-19926 (reset internal pointer earlier while splicing array
-    while COW violation flag is still set). (alexandre-daubois)
-  . Added form feed (\f) in the default trimmed characters of trim(), rtrim()
-    and ltrim(). (Weilin Du)
-  . Invalid mode values now throw in array_filter() instead of being silently
-    defaulted to 0. (Jorg Sowa)
-  . Fixed bug GH-21058 (error_log() crashes with message_type 3 and
-    null destination). (David Carlier)
-  . Fixed bug GH-13204 (glob() fails if square bracket is in current directory).
-    (ndossche)
-  . Add array size maximum to array_diff(). (ndossche)
-  . Add enum SortDirection. (timwolla)
-  . pathinfo() raises a ValueError with an invalid $flags argument.
-    (David Carlier)
-  . Passing an invalid flag value to the second argument of scandir() will now
-    throw a ValueError. (alexandre-daubois)
-  . array_change_key_case() now raises a ValueError when an invalid $case
-    argument value is passed. (Girgias)
-  . linkinfo() now raises a ValueError when the argument is an empty string.
-    (Weilin Du)
-  . getenv() and putenv() now raises a ValueError when the first argument
-    contains NUL bytes. (Weilin Du)
-  . dl() now raises a ValueError when the $extension_filename argument contains
-    NUL bytes. (Weilin Du)
-  . openlog() now raises a ValueError when the $prefix argument contains NUL
-    bytes. (Weilin Du)
-  . parse_str() now raises a ValueError when the $string argument contains NUL
-    bytes. (Weilin Du)
-  . proc_open() now raises a ValueError when the $cwd argument contains NUL
-    bytes. (Weilin Du)
-  . ini_get_all() now includes the built-in default value in the details.
-    (sebastian)
-  . Fixed bug GH-22171 (Invalid auth header generation in http(s) stream
-    wrapper). (David Carlier)
-  . Fixed bug GH-17384 (number_format() may exhaust memory with decimals
-    outside the range from -2147483648 to 2147483647). (Weilin Du)
-
-- Streams:
-  . Added new stream errors API including new StreamException, StreamError
-    classes, StreamErrorStore, StreamErrorMode, StreamErrorCode enums,
-    stream_last_errors() and stream_clear_errors() functions, error_mode,
-    error_store and error_handler stream context options and extending some
-    stream functions with context param. (Jakub Zelenka)
-  . Added so_keepalive, tcp_keepidle, tcp_keepintvl and tcp_keepcnt stream
-    socket context options. (Jakub Zelenka)
-  . Added so_reuseaddr streams context socket option that allows disabling
-    address resuse. (Jakub Zelenka)
-  . Added so_linger stream socket context option. (Jakub Zelenka)
-  . Fixed bug GH-20370 (User stream filters could violate typed property
-    constraints). (alexandre-daubois)
-  . Allowed filtered streams to be casted as fd for select. (Jakub Zelenka)
-  . Fixed bug GH-21221 (Prevent closing of innerstream of php://temp stream).
-    (ilutov)
-  . Improved stream_socket_server() bind failure error reporting. (ilutov)
-  . Fixed bug #49874 (ftell() and fseek() inconsistency when using stream
-    filters). (Jakub Zelenka)
-
-- URI:
-  . Added Uri\Rfc3986\Uri::getUriType() and Uri\WhatWg\Url::isSpecialScheme().
-    (kocsismate)
-  . Added Uri\Rfc3986\Uri::getHostType() and Uri\WhatWg\Url::getHostType().
-    (kocsismate)
-  . Added Uri\Rfc3986\UriBuilder. (kocsismate)
-
-- Zip:
-  . Fixed bug GH-21682 (ZipArchive instances should not be serializable).
-    serialize()/unserialize() now throw unless a subclass overrides
-    __serialize()/__unserialize(). (iliaal)
-  . Fixed ZipArchive callback being called after executor has shut down.
-    (ilutov)
-  . Support minimum version for libzip dependency updated to 1.0.0.
-    (David Carlier)
-  . Added ZipArchive::openString() method.
-    (Tim Starling, Soner Sayakci, Ghaith Olabi)
-
-- Zlib:
-  . deflate_init() now raises a TypeError when the value for option
-    "level", "memory", "window", or "strategy" is not of type int.
-    (Weilin Du)
-  . inflate_init() now raises a TypeError when the value for option
-    "window" is not of type int. (Weilin Du)
+?? ??? ????, PHP 8.7.0alpha1

 <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>>
diff --git a/UPGRADING b/UPGRADING
index 7f1fc588bd0..f66d5b6987f 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -1,4 +1,4 @@
-PHP 8.6 UPGRADE NOTES
+PHP 8.7 UPGRADE NOTES

 1. Backward Incompatible Changes
 2. New Features
@@ -19,907 +19,30 @@ PHP 8.6 UPGRADE NOTES
 1. Backward Incompatible Changes
 ========================================

-- Core:
-  . By-reference foreach loops may now visit previously skipped elements
-    after array compaction. Internal pointers on deleted elements now move
-    to the next surviving element during copy-on-write.
-  . ??/empty() on a magic property no longer call __get() when __isset()
-    has materialized the property by writing into the property table.
-    The freshly-written value is returned directly. isset() is unaffected.
-
-- COM:
-  . It is no longer possible to clone variant objects because the cloning
-    behavior was ill-defined.
-
-- Curl:
-  . The callback registered with CURLOPT_READFUNCTION now throws a ValueError
-    when returning an integer other than 0, CURL_READFUNC_ABORT or
-    CURL_READFUNC_PAUSE.
-
-- DOM:
-  . Properties previously documented as @readonly (e.g. DOMNode::$nodeType,
-    DOMDocument::$xmlEncoding, DOMEntity::$actualEncoding,
-    DOMEntity::$encoding, DOMEntity::$version) are now declared with asymmetric
-    visibility (public private(set)). Attempts to write to them from outside
-    the class now raise "Cannot modify private(set) property <class>::$<prop>
-    from global scope" instead of the prior readonly modification error.
-    ReflectionProperty::isWritable() also reports these properties
-    accurately.
-  . Array access on Dom\DtdNamedNodeMap objects now returns null for negative
-    integer indexes instead of returning the first node.
-  . Array access on Dom\DtdNamedNodeMap objects now raises a ValueError when
-    the integer index is greater than INT_MAX instead of overflowing to a
-    smaller index.
-
-- FTP:
-  . ftp_nb_fget(), ftp_nb_fput(), ftp_nb_get() and ftp_nb_put() now throw an
-    Error when the connection is already transferring, instead of emitting a
-    warning and returning false. ftp_close() already throws on the same
-    condition.
-
-- GD:
-  . imagesetstyle(), imagefilter() and imagecrop() filter the types / values of
-    their array arguments and raise a TypeError / ValueError accordingly.
-  . imageaffinematrixget() now enforces the documented array|float type for the
-    $options parameter, including the corresponding weak and strict typing
-    behavior.
-
-- GMP:
-  . gmp_fact() now throws a ValueError if $num does not fit into an unsigned
-    long.
-  . gmp_pow(), gmp_binomial(), gmp_root() and gmp_rootrem() now throw a
-    ValueError if their second argument does not fit into an unsigned long.
-  . The shift (<<, >>) and exponentiation (**) operators on GMP objects now
-    throw a ValueError when GMP right operands are outside the unsigned long range,
-    instead of silently truncating them.
-  . GMP integer string parsing now throws a ValueError for strings containing NUL
-    bytes, instead of silently truncating them.
-  . gmp_powm() modulo-by-zero now raises a DivisionByZeroError whose message
-    includes the function name and argument index ($modulus).
-
-- Intl:
-  . Passing a non-stringable object as a time zone to Intl APIs that accept
-    time zone objects or strings now raises a TypeError instead of an Error.
-  . IntlIterator::current() now returns null when called before the iterator is
-    positioned, or after the iterator becomes invalid, instead of exposing an
-    undefined value.
-  . IntlBreakIterator::getLocale() now raises a ValueError when the type is
-    neither Locale::ACTUAL_LOCALE nor Locale::VALID_LOCALE instead of
-    returning false.
-  . MessageFormatter::parse() and parseMessage() now return PHP_INT_MIN as
-    int, rather than float, on 64-bit platforms when parsing integer values.
-  . The $type parameter of IntlBreakIterator::getPartsIterator() has been
-    changed from string to int to match the underlying implementation.
-  . UConverter::transcode() now rejects from_subst and to_subst option values
-    longer than 127 bytes instead of silently truncating the length before
-    passing it to ICU.
-  . ResourceBundle::get() and resourcebundle_get() now report fallback-disabled
-    resource lookups with "without fallback to <locale>" instead of the
-    malformed "without fallback from to <locale>".
-  . IntlDateFormatter::parse()/datefmt_parse() and
-    IntlDateFormatter::localtime()/datefmt_localtime() now raise a TypeError
-    when the offset argument is not of type int instead of silently converting
-    the value.
-  . Collator::sort(), collator_sort(), Collator::asort(), and
-    collator_asort() now report UTF-8/UTF-16 conversion failures during
-    comparison through the intl error mechanism and return false. With
-    intl.use_exceptions enabled, these failures throw IntlException. Previously,
-    these paths emitted a warning and compared the value as an empty string.
-
-- MBstring:
-  . Unicode data tables have been updated to Unicode 18.0
-
-- PCNTL:
-  . pcntl_alarm() now raises a ValueError if the seconds argument is
-    lower than zero or greater than the platform's UINT_MAX.
-  . pcntl_exec() now raises a ValueError if the $args argument is not a list
-    array.
-
-- PCRE:
-  . preg_grep() now returns false instead of a partial array when a PCRE
-    execution error occurs (e.g. malformed UTF-8 input with the /u modifier).
-    This is consistent with other preg_* functions.
-
-- PGSQL:
-  . pg_fetch_object() now reports the ValueError for a non-empty
-    $constructor_args on a class without a constructor on the
-    $constructor_args argument instead of $class. Errors raised when
-    the requested class is not instantiable (abstract, interface, enum)
-    now surface before the row is fetched.
-
-- Phar:
-  . Phar::mungServer() now raises a ValueError when an invalid argument value
-    is passed instead of being silently ignored.
-  . Phar::addEmptyDir() now rejects "/.phar" paths in addition to ".phar"
-    paths, and raises the same BadMethodCallException for attempts to create
-    the reserved magic ".phar" directory through that form.
-  . Phar::addEmptyDir() now treats non-magic names that merely share the
-    ".phar" prefix as ordinary directories.
-  . Files are only automatically interpreted as Phar archives when included
-    if ".phar" occurs as an extension in the filename component of their
-    paths. Previously, it could occur in a directory name or as part of an
-    extension such as ".pharma".
-
-- Session:
-  . Setting session.cookie_path, session.cookie_domain, or session.cache_limiter
-    to a value containing NUL bytes now emits a warning and leaves the setting
-    unchanged. Previously, NUL bytes were silently accepted: for cookie_path
-    and cookie_domain this caused the SAPI to drop the Set-Cookie header; for
-    cache_limiter the value was silently truncated at the NUL byte.
-  . A ValueError is thrown if $name is a string containing NUL bytes in
-    session_module_name().
-  . session_encode() now returns an empty string instead of false for empty
-    sessions. It only returns false now when the session data could not be
-    encoded. This mainly happens with the default serialization handler
-    if a key contains the pipe | character.
-  . When session.lazy_write is enabled and a session handler implements
-    SessionUpdateTimestampHandlerInterface, sessions that were read as empty
-    and remain empty at write time will now trigger updateTimestamp() instead
-    of write(). Previously, write() was always called for empty sessions
-    because session_encode() returned false, bypassing the lazy_write
-    comparison. Custom session handlers that rely on write() being called
-    with empty data (e.g. to destroy the session) should implement the same
-    logic in their updateTimestamp() method.
-  . The defaults of three session INI settings have changed to provide secure
-    behavior out of the box:
-      - session.use_strict_mode is now 1 (was 0). Strict mode rejects
-        uninitialized session IDs, mitigating session fixation. Custom session
-        handlers that previously relied on accepting externally supplied IDs
-        without a corresponding storage entry must either implement
-        validateId() / create_sid() or explicitly set this to 0.
-      - session.cookie_httponly is now 1 (was 0). Session cookies are no
-        longer accessible to JavaScript via document.cookie. Applications
-        that read the session cookie from JavaScript must explicitly set
-        this to 0.
-      - session.cookie_samesite is now "Lax" (was unset). Session cookies
-        are no longer sent on cross-site requests other than top-level
-        navigations using safe HTTP methods. Applications that depend on
-        session cookies being sent on cross-site POST submissions must
-        explicitly set this to "None" (and also set session.cookie_secure
-        to 1).
-    RFC: https://wiki.php.net/rfc/session_security_defaults
-  . SessionHandler::validateId() has been added and delegates to the
-    configured save handler. A subclass that declares validateId() without
-    a return type now emits a deprecation notice for the tentative bool
-    return type. A subclass that overrides open() without calling
-    parent::open() keeps its previous behavior and emits a warning when an
-    ID is validated.
-
-- Shmop:
-  . shmop_open() now raises a ValueError when the $key argument is outside the
-    platform's key_t range instead of passing a truncated key to the operating
-    system.
-
-- SimpleXML:
-  . SimpleXMLElement::__construct() now raises a ValueError when the $data
-    argument contains NUL bytes, matching simplexml_load_file(). With
-    $dataIsURL set, it previously truncated the path at the first NUL byte.
-    Without it, the string went to libxml, which with default options rejects a
-    NUL on current versions but accepts the truncated document on older ones
-    and under LIBXML_RECOVER.
-
-- SOAP:
-  . The "classmap" option of SoapClient and SoapServer now rejects arrays
-    containing integer keys. Previously, sparse integer-keyed and mixed-keyed
-    arrays could be accepted. SoapClient now throws TypeError for non-array
-    "classmap" options and ValueError for arrays containing integer keys, also
-    when the "exceptions" option is disabled.
-  . WSDL/XML Schema parsing now rejects out-of-range integer values for
-    occurrence constraints and integer restriction facets. Negative minOccurs
-    and maxOccurs values are rejected as well.
-  . SOAP encoding errors now report the affected type or failing operation in
-    the error message instead of the generic "Encoding: Violation of encoding
-    rules" message. Code that compares the exact message may need to be
-    updated.
-
-- Sockets:
-  . socket_set_option() with SO_ATTACH_REUSEPORT_CBPF now requires an int
-    $value and a $level of SOL_SOCKET. Any other value type throws a TypeError
-    instead of being coerced, and any other level raises a warning and returns
-    false.
-  . socket_set_option() with SO_ATTACH_REUSEPORT_CBPF and a $value of 0 now
-    detaches the reuseport filter through SO_DETACH_REUSEPORT_BPF. It
-    previously used SO_DETACH_BPF, an alias of SO_DETACH_FILTER, which left the
-    reuseport program attached.
-
-- Sodium:
-  . The password-hashing functions sodium_crypto_pwhash(),
-    sodium_crypto_pwhash_str(),
-    sodium_crypto_pwhash_scryptsalsa208sha256() and
-    sodium_crypto_pwhash_scryptsalsa208sha256_str() now throw ValueError
-    instead of SodiumException when an argument is out of range, such as an
-    opslimit or memlimit below the documented minimum. SodiumException is
-    still thrown for internal libsodium failures.
-
-- SPL:
-  . SplObjectStorage::getHash() implementations may no longer mutate any
-    SplObjectStorage instance. Attempting to do so now throws an Error.
-  . SplFileObject::next() now advances the stream when no prior current()
-    call has cached a line. A subsequent current() call returns the new line
-    rather than the previous one.
-  . SplFileObject::fgets() no longer caches the returned line for subsequent
-    current() calls. current() now re-reads from the current stream position
-    instead of returning the line fgets() just returned.
-  . SplFileObject::next() past EOF no longer increments key() without bound.
-    SplFileObject::seek() past EOF now produces the same key() value as
-    SplTempFileObject; the two previously returned different values.
-  . DirectoryIterator::key() now returns int|string,
-    and DirectoryIterator::current() returns string|SplFileInfo|static.
-
-- Standard:
-  . array_intersect() with at least two arrays now converts values to strings
-    while scanning its inputs instead of during sort comparisons. This can
-    change the number and order of conversion warnings and __toString() calls,
-    which conversion exception is reached, and the result for stateful
-    __toString() implementations. Argument types are validated before checking
-    for empty arrays or converting values, so an invalid later argument can
-    suppress conversion side effects from earlier arrays. Values are not
-    converted if any input array is empty.
-  . Form feed (\f) is now added to the default trimmed characters of trim(),
-    rtrim() and ltrim().
-    RFC: https://wiki.php.net/rfc/trim_form_feed
-  . array_filter() now raises a ValueError when an invalid $mode argument value
-    is passed.
-  . array_change_key_case() now raises a ValueError when an invalid $case
-    argument value is passed.
-  . getenv() and putenv() now raise a ValueError when the first argument
-    contains NUL bytes.
-  . dl() now raises a ValueError when the $extension_filename argument contains
-    NUL bytes.
-  . openlog() now raises a ValueError when the $prefix argument contains NUL
-    bytes.
-  . parse_str() now raises a ValueError when the $string argument contains NUL
-    bytes.
-  . setlocale() now raises a ValueError when a locale name contains NUL bytes,
-    instead of silently truncating it.
-    Arrays are now accepted only for the $locales argument. Passing an array as
-    a later variadic locale argument now throws a TypeError. Passing any
-    additional locale arguments when $locales is an array now throws an
-    ArgumentCountError.
-  . linkinfo() now raises a ValueError when the $path argument is empty.
-  . pathinfo() now raises a ValueError when an invalid $flags argument value is
-    passed.
-  . scandir() now raises a ValueError when an invalid $sorting_order argument
-    value is passed.
-  . number_format() now raises a ValueError when $decimals is outside the
-    integer range instead of silently clamping very large positive values.
-  . sleep() now raises a ValueError when $seconds is greater than the platform
-    limit (UINT_MAX seconds, or UINT_MAX / 1000 seconds on Windows) instead of
-    allowing the value to overflow.
-  . usleep() now raises a ValueError when $microseconds is greater than
-    UINT_MAX instead of allowing the value to overflow.
-  . proc_open() now raises a ValueError when the $cwd argument contains NUL
-    bytes.
-  . base_convert(), bindec(), hexdec() and octdec() now raise a notice when
-    they cannot precisely convert the given number.
-  . The following functions now raise a ValueError when the $filename argument
-    contains NUL bytes:
-    - fileperms()
-    - fileinode()
-    - filesize()
-    - fileowner()
-    - filegroup()
-    - fileatime()
-    - filemtime()
-    - filectime()
-    - filetype()
-    - is_writable()
-    - is_readable()
-    - is_executable()
-    - is_file()
-    - is_dir()
-    - is_link()
-    - file_exists()
-    - lstat()
-    - stat()
-  . unpack() now reads a "<" or ">" immediately following a format code as an
-    endianness modifier rather than as the first character of the element name.
-    Formats such as "s<value" now produce the key "value" instead of "<value",
-    and "C>name" raises a ValueError because the C format code accepts no
-    endianness modifier. A name starting with these characters is unaffected
-    when a repeater precedes it, as in "s1<value".
-    RFC: https://wiki.php.net/rfc/pack-unpack-endianness-signed-integers-support
-
-- Sysvshm:
-  . shm_attach() now raises a ValueError when the $key argument is outside the
-    platform's key_t range instead of passing a truncated key to the operating
-    system.
-
-- URI:
-  . Uri\WhatWg\Url::__construct() now sets $softErrors to an empty array when
-    URL processing throws an exception, instead of preserving its value.
-    URL validation errors remain available in the
-    Uri\WhatWg\InvalidUrlException::$errors property.
-
-- Zip:
-  . ZipArchive::extractTo now raises a TypeError for the files argument if one
-    or more of the entries is not a string.
-  . ZipArchive::addGlob() and ZipArchive::addPattern() now raise a TypeError
-    when the "remove_all_path" option is not of type bool, or when the
-    "comp_method", "comp_flags", or "enc_method" options are not of type int
-    (numeric strings are coerced), instead of emitting a warning.
-  . Serializing or unserializing a ZipArchive now throws an Exception. A
-    subclass can override __serialize() and __unserialize() to round-trip
-    through ZipArchive::closeString() and ZipArchive::openString().
-
-- Zlib:
-  . deflate_init() now raises a TypeError when the value for option "level",
-    "memory", "window", or "strategy" is not of type int.
-  . inflate_init() now raises a TypeError when the value for option "window" is
-    not of type int.
-
 ========================================
 2. New Features
 ========================================

-- Core:
-  . Readonly properties may now declare default values.
-    RFC: https://wiki.php.net/rfc/readonly_property_defaults
-  . It is now possible to use reference assignment on WeakMap without the key
-    needing to be present beforehand.
-  . It is now possible to define the __debugInfo() magic method on enums.
-    RFC: https://wiki.php.net/rfc/debugable-enums
-  . #[\Override] can now be applied to class constants, including enum cases.
-    RFC: https://wiki.php.net/rfc/override_constants
-  . Implemented partial function application
-    RFC: https://wiki.php.net/rfc/partial_function_application_v2
-  . Allow direct mutation of objects stored in constants or class constants via
-    OBJ->prop = $val.
-    RFC: https://wiki.php.net/rfc/const_object_property_write
-
-- Curl:
-  . curl_getinfo() return array now includes a new size_delivered key, which
-    indicates the total number of bytes passed to the download write callback.
-    This value can also be obtained by passing CURLINFO_SIZE_DELIVERED as the
-    $option parameter.
-    Requires libcurl 8.20.0 or later.
-  . Added CURLOPT_SEEKFUNCTION to register a callback that repositions a
-    streamed request body so libcurl can rewind and resend it on a redirect,
-    multi-pass authentication, or a retried reused connection instead of
-    failing with CURLE_SEND_FAIL_REWIND. The callback receives the CurlHandle,
-    offset and origin, and must return one of CURL_SEEKFUNC_OK,
-    CURL_SEEKFUNC_FAIL or CURL_SEEKFUNC_CANTSEEK.
-
-- Date:
-  . Added a new Time\Duration class.
-    RFC: https://wiki.php.net/rfc/duration_class
-
-- Fileinfo:
-  . finfo_file() now works with remote streams.
-
-- GMP:
-  . Added gmp_powm_sec() for side-channel quiet modular exponentiation.
-    Requires GNU MP 5.0.0 or later; it is not available on official Windows
-    builds using MPIR.
-  . Added gmp_prevprime() to get the largest prime smaller than the given
-    number. The optional $definitely_prime output parameter indicates whether
-    the returned number is definitely prime, as opposed to probably prime.
-    A ValueError is thrown if no such prime exists. This function is available
-    only when PHP is built against GNU MP 6.3.0 or later; it is not available
-    on official Windows builds using MPIR.
-
-- Intl:
-  . Added the static methods IntlDatePatternGenerator::getSkeleton() and
-    IntlDatePatternGenerator::getBaseSkeleton() to generate the unique skeleton
-    and base skeleton for a date/time pattern.
-  . Added Locale::getDisplayKeyword() and Locale::getDisplayKeywordValue(),
-    with the aliases locale_get_display_keyword() and
-    locale_get_display_keyword_value(), respectively.
-    RFC: https://wiki.php.net/rfc/getdisplaykeyword_and_getdisplaykeywordvalue
-  . Added IntlNumberRangeFormatter class to format an interval of two numbers
-    with a given skeleton, locale, IntlNumberRangeFormatter::COLLAPSE_AUTO,
-    IntlNumberRangeFormatter::COLLAPSE_NONE,
-    IntlNumberRangeFormatter::COLLAPSE_UNIT,
-    IntlNumberRangeFormatter::COLLAPSE_ALL collapse and
-    IntlNumberRangeFormatter::IDENTITY_FALLBACK_SINGLE_VALUE,
-    IntlNumberRangeFormatter::IDENTITY_FALLBACK_APPROXIMATELY_OR_SINGLE_VALUE,
-    IntlNumberRangeFormatter::IDENTITY_FALLBACK_APPROXIMATELY and
-    IntlNumberRangeFormatter::IDENTITY_FALLBACK_RANGE identity fallbacks.
-    It is supported as of ICU 63.
-  . Added SpoofChecker::areBidiConfusable() to check whether two strings are
-    confusable for a given text direction, along with the SpoofChecker::LTR
-    and SpoofChecker::RTL direction constants.
-    It is supported as of ICU 74.
-  . Added SpoofChecker::getBidiSkeleton() to generate a confusable skeleton for
-    a given text direction. It is supported as of ICU 74.
-  . Added SpoofChecker::getSkeleton() to generate a confusable skeleton for a
-    given string.
-
-- IO:
-  . Added new polling API.
-    RFC: https://wiki.php.net/rfc/poll_api
-
-- JSON:
-  . Added extra info about error location to the JSON error messages returned
-    from json_last_error_msg() and JsonException message.
-
-- OpenSSL:
-  . Added TLS session resumption support for streams with new stream context
-    options: session_data, session_new_cb, session_cache, session_cache_size,
-    session_timeout, session_id_context, session_get_cb, session_remove_cb,
-    and num_tickets. This allows saving and restoring client sessions across
-    requests, implementing custom server-side session storage, and controlling
-    session cache behavior.
-    RFC: https://wiki.php.net/rfc/tls_session_resumption
-  . Added TLS external PSK support for streams with new stream context options:
-    psk_client_cb and psk_server_cb. This allows setting and receiving PSK.
-  . Added TLS 1.3 early data (0-RTT) support for streams. Clients send early
-    data with the early_data context option; servers accept it with
-    max_early_data and receive it through the early_data_cb callback. The
-    outcome is reported as 'accepted', 'rejected' or 'not_sent' in the
-    early_data key of the crypto stream_get_meta_data() array.
-
-- PDO_PGSQL:
-  . Added Pdo\Pgsql::ATTR_CHUNK_SIZE, the number of rows a statement fetches
-    per chunk. A value of 1 or more enters the lazy fetch mode of
-    PDO::ATTR_PREFETCH => 0. Setting PDO::ATTR_PREFETCH replaces the chunk
-    size. Statements that are prepared with neither it nor PDO::ATTR_PREFETCH
-    fall back to the value set on the connection.
-    Requires libpq 17 or later.
-
-- Phar:
-  . Overriding the getMTime() and getPathname() methods of SplFileInfo now
-    influences the result of the phar buildFrom family of functions.
-    This makes it possible to override the timestamp and names of files.
-
-- SNMP:
-  . It is now possible to use AES192, AES192C, AES256, and AES256C as
-    SNMPv3 security protocols if the underlying library supports them.
-    RFC: https://wiki.php.net/rfc/snmp_improvements_2026#increase_the_number_of_snmpv3_security_protocols_supported
-  . It is now possible to reset the MIB tree using the new snmp_init_mib()
-    function.
-    RFC: https://wiki.php.net/rfc/snmp_improvements_2026#allow_the_snmp_mib_to_be_reset
-  . Additional MIB parsing and output control functionality has been exposed
-    via the snmp_set_mib_option(), snmp_set_output_option(),
-    snmp_set_string_output_format() functions, the $numeric_index,
-    $numeric_timeticks, $extended_index, $dont_print_units, $escape_quotes,
-    $print_hex_text SNMP properties, and the SNMP::setOidOutputFormat(),
-    SNMP::setStringOutputFormat() methods. (eskyuu)
-    RFC: https://wiki.php.net/rfc/snmp_improvements_2026#implement_more_mib_parsing_and_value_output_controls
-
-- Standard:
-  . pack() and unpack() now accept the "<" and ">" endianness modifiers on
-    the signed and unsigned integer format codes.
-    RFC: https://wiki.php.net/rfc/pack-unpack-endianness-signed-integers-support
-  . pack() and unpack() now accept the "<" and ">" endianness modifiers on
-    the float and double format codes.
-    RFC: https://wiki.php.net/rfc/pack-unpack-float-endianness-modifier
-
-- Streams:
-  . Added new stream errors API including new classes, enums, functions and
-    internal API. It is controlled using error_mode, error_store and
-    error_handler stream context options.
-    RFC: https://wiki.php.net/rfc/stream_errors
-  . Added the "filter.max_filter_count" stream context option for php://filter
-    URLs. When set, opening the stream fails with a warning if the URL would
-    add more filters than the configured value. Negative values disable the
-    check.
-    RFC: https://wiki.php.net/rfc/limit-maximum-number-of-filter-chains
-  . Added stream socket context option so_reuseaddr that allows disabling
-    address reuse (SO_REUSEADDR) and explicitly uses SO_EXCLUSIVEADDRUSE on
-    Windows.
-  . Added stream socket context options so_keepalive, tcp_keepidle,
-    tcp_keepintvl and tcp_keepcnt that allow setting socket keepalive
-    options.
-  . Added stream socket context option so_linger that sets SO_LINGER on TCP
-    sockets. A positive value enables lingering for that many seconds, zero
-    or a negative value disables it. Values above 65535 are clamped as the
-    linger time is limited to an unsigned short on some platforms.
-  . Added stream socket context options so_rcvbuf and so_sndbuf that set the
-    socket receive and send buffer sizes in bytes (SO_RCVBUF and SO_SNDBUF) on
-    TCP and UDP sockets. The value must be an integer between 1 and 2147483647,
-    any other value makes the stream creation fail. The operating system may
-    round, cap or otherwise adjust the requested size, and may stop sizing that
-    buffer automatically, so the size read back can differ from the one
-    requested.
-  . Allowed casting filtered streams as file descriptors for select.
-  . Added the "write_seek_mode" filter parameter for the bz2, iconv,
-    zlib, and string stream filters. This parameter must be set via an
-    associative array where the key is "write_seek_mode" and the
-    value is one of the following strings: "preserve", "reset", or "strict".
-
-- URI:
-  . Added Uri\Rfc3986\Uri::getUriType() and Uri\WhatWg\Url::isSpecialScheme().
-    RFC: https://wiki.php.net/rfc/uri_followup#uri_type_detection
-  . Added Uri\Rfc3986\Uri::getHostType() and Uri\WhatWg\Url::getHostType().
-    RFC: https://wiki.php.net/rfc/uri_followup#host_type_detection
-  . Added Uri\Rfc3986\UriBuilder and Uri\WhatWg\UrlBuilder.
-    RFC: https://wiki.php.net/rfc/uri_followup#uri_building
-  . Added Uri\url_percent_encode().
-    RFC: https://wiki.php.net/rfc/uri_followup#percent-encoding_support
-
 ========================================
 3. Changes in SAPI modules
 ========================================

-- CLI:
-  . The built-in development server now accepts requests using the HTTP QUERY
-    method instead of returning 501 Not Implemented.
-  . The built-in development server no longer reflects the "Host" header from
-    requests.
-
 ========================================
 4. Deprecated Functionality
 ========================================

-- Core:
-  . Using "namespace" as a class constant name is deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_using_namespace_as_a_class_constant_name
-  . Using the return statement in a finally block is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_returning_from_a_finally_block
-  . Specifying a return type of array|null / ?array for __debugInfo() is now
-    deprecated. Specify array instead.
-  . Returning values from __construct() and __destruct() is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecate-return-value-from-construct
-  . Making __construct() and __destruct() a Generator is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecate-return-value-from-construct
-  . Naming a function readonly is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_the_possibility_to_name_a_function_readonly
-  . Passing a 3rd argument to define() is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_define_with_case_insensitive_being_specified
-  . Calling is_a() or is_subclass_of() with a string as the first argument
-    when $allow_string is false is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_is_a_with_string_when_allow_string_is_false
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_is_subclass_of_with_string_when_allow_string_is_false
-
-- BZ2:
-  . Passing an object for the Bzip2 {de}compression stream filter is now
-    deprecated. Use get_object_vars() on the object instead.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_as_parameters_to_the_bzip2decompress_and_bzip2compress_stream_filters
-
-- GMP:
-  . The shift (<<, >>) and exponentiation (**) operators on GMP objects now
-    emit a deprecation warning when converting a float right operand to int
-    loses precision.
-
-- Mbstring:
-  . Mbregex has been deprecated, because the underlying Oniguruma library
-    is no longer maintained.
-    RFC: https://wiki.php.net/rfc/eol-oniguruma
-  . Passing objects to mb_convert_variables() is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_for_vars_parameter_of_mb_convert_variables
-
-- MySQLi:
-  . The mysqli_get_charset() function and mysqli::get_charset() method are now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_mysqli_get_charset
-  . The mysqli_stmt_init() function, mysqli::stmt_init() method, and calling the
-    mysqli_stmt constructor without providing the $query parameter are now
-    deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_mysqlistmt_init
-
-- Reflection:
-  . Calling ReflectionProperty::setValue() with an object that is not an
-    instance of the class on which the property was declared is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_reflectionpropertysetvalue_and_reflectionpropertysetrawvalue_with_wrong_types
-  . Calling ReflectionProperty::setRawValue() with an object that is not an
-    instance of the class on which the property was declared is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_reflectionpropertysetvalue_and_reflectionpropertysetrawvalue_with_wrong_types
-  . Calling ReflectionMethod::invoke() or ReflectionMethod::invokeArgs() with
-    an object and a static method is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_reflectionmethodinvoke_and_reflectionmethodinvokeargs_with_objects_for_static_methods
-
-- Session:
-  . It is now deprecated to pass an object that does not implement the
-    create_sid() and validateId() methods.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_passing_a_sessionhandler_object_to_session_set_save_handler_which_does_not_contain_the_create_sid_and_validateid
-  . A deprecation is now emitted when implementing SessionHandlerInterface on a
-    class which doesn't define the create_sid() or validateId() methods, as
-    those will be moved from SessionUpdateTimestampHandlerInterface and
-    SessionIdInterface to SessionHandlerInterface.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_passing_a_sessionhandler_object_to_session_set_save_handler_which_does_not_contain_the_create_sid_and_validateid
-
-- SPL:
-  . The spl_classes() function is now deprecated. Use
-    ReflectionExtension::getClassNames() instead.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_spl_classes
-  . The spl_object_hash() function is now deprecated. Use spl_object_id()
-    instead.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_spl_object_hash
-  . The following ArrayIterator methods are now deprecated:
-    * ArrayIterator::getFlags()
-    * ArrayIterator::setFlags()
-    * ArrayIterator::asort()
-    * ArrayIterator::ksort()
-    * ArrayIterator::uasort()
-    * ArrayIterator::uksort()
-    * ArrayIterator::natsort()
-    * ArrayIterator::natcasesort()
-    * ArrayIterator::unserialize()
-    * ArrayIterator::serialize()
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_arrayiterator_methods_that_inherit_arrayobject_implementation
-  . The following SplFileObject methods are now deprecated:
-    * SplFileObject::fgetcsv()
-    * SplFileObject::fputcsv()
-    * SplFileObject::setCsvControl()
-    * SplFileObject::getCsvControl()
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_splfileobject_csv_methods
-
-- Standard:
-  . metaphone() is deprecated.
-    Please use a userland phonetic matching library instead.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_metaphone_function
-  . Using more than 16 filters in a php://filter URL without configuring the
-    "filter.max_filter_count" stream context option now emits an E_DEPRECATED
-    warning. Use stream_filter_append() or configure this option explicitly.
-    RFC: https://wiki.php.net/rfc/limit-maximum-number-of-filter-chains
-  . Passing an object to array_walk{_recursive} is now deprecated. Use
-    get_object_vars() on the object instead.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_for_array_parameter_of_array_walk_and_array_walk_recursive
-  . Passing an object as the $data argument to http_build_query() is now
-    deprecated. The interpretation of object values within $data as arrays
-    is also deprecated. Convert objects to arrays with get_object_vars()
-    before calling the function.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_for_data_parameter_of_http_build_query
-  . The is_double() function is now deprecated. Use is_float() instead.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_is_double
-  . The is_long() and is_integer() functions are now deprecated. Use is_int()
-    instead.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_is_integer
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_is_long
-  . The doubleval() function is now deprecated. Use floatval() instead.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_doubleval
-  . The strcoll() function is now deprecated. Use Collator::compare() instead.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_strcoll
-  . The SORT_LOCALE_STRING constant for the family of sort functions is now
-    deprecated. Use one of the following functions instead:
-    * Collator::sort()
-    * Collator::asort()
-    * Collator::sortWithSortKeys()
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_sort_locale_string_flag_for_sort_functions
-
-- Zlib:
-  . Passing an object for the zlib deflate and inflate stream filter is now
-    deprecated. Use get_object_vars() on the object instead.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_as_parameters_to_the_zlibinflate_and_zlibdeflate_stream_filters
-  . Passing an object as the $option argument to deflate_init and inflate_init
-    is now deprecated. Use get_object_vars() on the object instead.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_for_options_parameter_of_deflate_init_and_inflate_init
-
 ========================================
 5. Changed Functions
 ========================================

-- Date:
-  . The following DateTime, DateTimeImmutable, DateTimeZone, DateInterval, and DatePeriod methods now have tentative static return types:
-    DateTime::createFromInterface()
-    DateTimeImmutable::__set_state()
-    DateTimeImmutable::modify()
-    DateTimeImmutable::add()
-    DateTimeImmutable::sub()
-    DateTimeImmutable::setTimezone()
-    DateTimeImmutable::setTime()
-    DateTimeImmutable::setDate()
-    DateTimeImmutable::setISODate()
-    DateTimeImmutable::setTimestamp()
-    DateTimeImmutable::createFromInterface()
-    DateTimeZone::__set_state()
-    DateInterval::__set_state()
-    DatePeriod::__set_state()
-
-- Filter:
-  . filter_var_array() return type has been narrowed from array|false|null to
-    array|false. The function always establishes an array before filtering, so
-    null was never returned. filter_input_array() is unaffected: it still
-    returns null when the requested superglobal does not exist.
-
-- LDAP:
-  . ldap_free_result() return type has been narrowed from bool to true. The
-    function already always returned true.
-
-- MySQLi:
-  . The return structure of mysqli_get_charset() no longer contains the
-    undocumented "comment" element. The value of "charsetnr" is now set to a
-    constant 0 as this number was an implementation detail that should not have
-    been exposed to the public.
-
-- OpenSSL:
-  . Output of openssl_x509_parse() contains criticalExtensions listing all
-    critical certificate extensions.
-  . openssl_sign() and openssl_verify() now have an additional optional
-    argument $salt_length that allows controlling the RSA-PSS salt length
-    when OPENSSL_PKCS1_PSS_PADDING is used. It accepts an explicit length or
-    one of the new OPENSSL_RSA_PSS_SALTLEN_* constants.
-
-- PDO_DBLIB:
-  . When using persistent connections, there is now a liveness check in the
-    constructor.
-
-- Phar:
-  . Phar::mungServer() now supports reference values.
-
-- Readline:
-  . readline_completion_function() now declares true as its return type. The
-    function assigns a static callback and then tests whether the assignment
-    landed, which is a tautology; an invalid callback throws a TypeError via
-    ZPP before the function body is reached.
-
-- Sockets:
-  . socket_addrinfo_lookup() now has an additional optional argument $error_code
-    that, when not null, receives the error code on failure (one of the EAI_*
-    constants).
-  . socket_cmsg_space() return type has been narrowed from ?int to int. Every
-    failure path has thrown a ValueError since PHP 8.0, so null was never
-    returned.
-
-- Standard:
-  . header_register_callback() now declares true as its return type. It has not
-    been able to return false since PHP 8.0.0, when passing an invalid
-    callback started throwing a TypeError instead.
-  . register_tick_function() now declares true as its return type. It has
-    always returned true on success; an invalid callback throws a TypeError
-    via ZPP before the function body is reached.
-  . ini_get_all() now includes a "builtin_default_value" element for each
-    directive when $details is true. It holds the built-in default value of the
-    directive (or null if it has none), independent of values set in php.ini,
-    on the command line, or at runtime.
-  . fclose(), file_put_contents() and copy() now return false when flushing
-    or closing the stream fails. Previously such failures were silently
-    ignored.
-
-- Zip:
-  . zip_entry_close() return type has been narrowed from bool to true. The
-    function already always returned true.
-
 ========================================
 6. New Functions
 ========================================

-- GMP:
-  . gmp_powm_sec()
-  . gmp_prevprime()
-
-- Intl:
-  . grapheme_strrev()
-    RFC: https://wiki.php.net/rfc/grapheme_strrev
-  . IntlDatePatternGenerator::getSkeleton()
-  . IntlDatePatternGenerator::getBaseSkeleton()
-  . Locale::getDisplayKeyword() and Locale::getDisplayKeywordValue()
-    RFC: https://wiki.php.net/rfc/getdisplaykeyword_and_getdisplaykeywordvalue
-  . SpoofChecker::areBidiConfusable()
-  . SpoofChecker::getBidiSkeleton()
-  . SpoofChecker::getSkeleton()
-
-- MySQLi:
-  . Added mysqli::quote_string() and mysqli_quote_string().
-    RFC: https://wiki.php.net/rfc/mysqli_quote_string
-
-- Reflection:
-  . ReflectionConstant::inNamespace()
-  . ReflectionProperty::isReadable() and ReflectionProperty::isWritable()
-    RFC: https://wiki.php.net/rfc/isreadable-iswriteable
-  . ReflectionParameter::getDocComment()
-    RFC: https://wiki.php.net/rfc/parameter-doccomments
-  . ReflectionAttribute::inNamespace()
-  . ReflectionAttribute::getNamespaceName()
-  . ReflectionAttribute::getShortName()
-
-- SNMP:
-  . snmp_init_mib()
-  . snmp_set_mib_option()
-  . snmp_set_output_option()
-  . snmp_set_string_output_format()
-
-- Sodium:
-  . sodium_crypto_ipcrypt_keygen()
-  . sodium_crypto_ipcrypt_encrypt()
-  . sodium_crypto_ipcrypt_decrypt()
-  . sodium_crypto_ipcrypt_nd_keygen()
-  . sodium_crypto_ipcrypt_nd_encrypt()
-  . sodium_crypto_ipcrypt_nd_decrypt()
-  . sodium_crypto_ipcrypt_ndx_keygen()
-  . sodium_crypto_ipcrypt_ndx_encrypt()
-  . sodium_crypto_ipcrypt_ndx_decrypt()
-  . sodium_crypto_ipcrypt_pfx_keygen()
-  . sodium_crypto_ipcrypt_pfx_encrypt()
-  . sodium_crypto_ipcrypt_pfx_decrypt()
-  . sodium_bin2ip()
-  . sodium_ip2bin()
-  . sodium_crypto_xof_shake128()
-  . sodium_crypto_xof_shake128_init()
-  . sodium_crypto_xof_shake128_update()
-  . sodium_crypto_xof_shake128_squeeze()
-  . sodium_crypto_xof_shake256()
-  . sodium_crypto_xof_shake256_init()
-  . sodium_crypto_xof_shake256_update()
-  . sodium_crypto_xof_shake256_squeeze()
-  . sodium_crypto_xof_turboshake128()
-  . sodium_crypto_xof_turboshake128_init()
-  . sodium_crypto_xof_turboshake128_update()
-  . sodium_crypto_xof_turboshake128_squeeze()
-  . sodium_crypto_xof_turboshake256()
-  . sodium_crypto_xof_turboshake256_init()
-  . sodium_crypto_xof_turboshake256_update()
-  . sodium_crypto_xof_turboshake256_squeeze()
-  . sodium_crypto_kem_keypair(), sodium_crypto_kem_seed_keypair(),
-    sodium_crypto_kem_secretkey(), sodium_crypto_kem_publickey(),
-    sodium_crypto_kem_enc() and sodium_crypto_kem_dec() expose the X-Wing
-    KEM (hybrid ML-KEM768+X25519, libsodium's recommended KEM).
-    Available when PHP is built against libsodium >= 1.0.22.
-  . sodium_crypto_kem_mlkem768_keypair(),
-    sodium_crypto_kem_mlkem768_seed_keypair(),
-    sodium_crypto_kem_mlkem768_secretkey(),
-    sodium_crypto_kem_mlkem768_publickey(),
-    sodium_crypto_kem_mlkem768_enc() and sodium_crypto_kem_mlkem768_dec()
-    expose the ML-KEM768 (FIPS 203) KEM.
-    Available when PHP is built against libsodium >= 1.0.22.
-
-- Standard:
-  . clamp() returns the given value if in range, else returns the nearest
-    bound.
-    RFC: https://wiki.php.net/rfc/clamp_v2
-  . stream_last_errors() and stream_clear_errors()
-    RFC: https://wiki.php.net/rfc/stream_errors
-  . stream_socket_get_crypto_status()
-
-- URI:
-  . Uri\Rfc3986\Uri::getUriType() and Uri\WhatWg\Url::isSpecialScheme()
-    RFC: https://wiki.php.net/rfc/uri_followup#uri_type_detection
-  . Uri\Rfc3986\Uri::getHostType() and Uri\WhatWg\Url::getHostType()
-    RFC: https://wiki.php.net/rfc/uri_followup#host_type_detection
-
-- Zip:
-  . ZipArchive::openString()
-  . ZipArchive::closeString()
-
 ========================================
 7. New Classes and Interfaces
 ========================================

-- Date:
-  . Time\Duration
-    RFC: https://wiki.php.net/rfc/duration_class
-  . Time\TimeException
-    RFC: https://wiki.php.net/rfc/duration_class
-
-- Intl:
-  . IntlNumberRangeFormatter
-
-- OpenSSL:
-  . Openssl\OpensslException
-  . Openssl\Session
-    RFC: https://wiki.php.net/rfc/tls_session_resumption
-  . Openssl\Psk
-
-- SNMP:
-  . enum: Snmp\Mib
-  . enum: Snmp\OidOutput
-  . enum: Snmp\Output
-  . enum: Snmp\StringOutput
-
-- Standard:
-  . enum SortDirection
-    RFC: https://wiki.php.net/rfc/sort_direction_enum
-  . StreamError
-  . StreamException
-  . enum StreamErrorStore
-  . enum StreamErrorMode
-  . enum StreamErrorCode
-    RFC: https://wiki.php.net/rfc/stream_errors
-  . Io\Poll\Context
-  . Io\Poll\Watcher
-  . enum Io\Poll\Backend
-  . enum Io\Poll\Event
-  . interface Io\Poll\Handle
-  . Io\IoException
-  . Io\Poll\PollException
-  . Io\Poll\FailedPollOperationException
-  . Io\Poll\FailedContextInitializationException
-  . Io\Poll\FailedHandleAddException
-  . Io\Poll\FailedWatcherModificationException
-  . Io\Poll\FailedPollWaitException
-  . Io\Poll\BackendUnavailableException
-  . Io\Poll\InactiveWatcherException
-  . Io\Poll\HandleAlreadyWatchedException
-  . Io\Poll\InvalidHandleException
-  . StreamPollHandle
-    RFC: https://wiki.php.net/rfc/poll_api
-
-- URI:
-  . Uri\Rfc3986\UriBuilder and Uri\WhatWg\UrlBuilder
-    RFC: https://wiki.php.net/rfc/uri_followup#uri_building
-  . enum Uri\WhatWg\UrlPercentEncodingMode
-    RFC: https://wiki.php.net/rfc/uri_followup#percent-encoding_support
-
 ========================================
 8. Removed Extensions and SAPIs
 ========================================
@@ -928,236 +51,22 @@ PHP 8.6 UPGRADE NOTES
 9. Other Changes to Extensions
 ========================================

-- Fileinfo:
-  . Upgraded to file 5.48.
-    Custom compiled magic databases from older file versions must be regenerated.
-
-- Hash:
-  . The bundled version of xxHash was upgraded to 0.8.2.
-
-- MySQLi:
-  . Added new constant MYSQLI_OPT_COMPRESS.
-
-- Opcache:
-  . JIT is now supported for ZTS builds on Apple Silicon.
-
 ========================================
 10. New Global Constants
 ========================================

-- Curl:
-  . CURLINFO_SIZE_DELIVERED (libcurl >= 8.20.0).
-  . CURLOPT_SEEKFUNCTION.
-  . CURL_SEEKFUNC_OK.
-  . CURL_SEEKFUNC_FAIL.
-  . CURL_SEEKFUNC_CANTSEEK.
-  . CURL_READFUNC_ABORT.
-
-- MySQLi:
-  . MYSQLI_OPT_COMPRESS.
-
-- OpenSSL:
-  . OPENSSL_RSA_PSS_SALTLEN_DIGEST.
-  . OPENSSL_RSA_PSS_SALTLEN_AUTO.
-  . OPENSSL_RSA_PSS_SALTLEN_MAX.
-
-- Sockets:
-  . TCP_USER_TIMEOUT (Linux only).
-  . AF_UNSPEC.
-  . EAI_BADFLAGS.
-  . EAI_NONAME.
-  . EAI_AGAIN.
-  . EAI_FAIL.
-  . EAI_NODATA.
-  . EAI_FAMILY.
-  . EAI_SOCKTYPE.
-  . EAI_SERVICE.
-  . EAI_ADDRFAMILY.
-  . EAI_SYSTEM.
-  . EAI_OVERFLOW.
-  . EAI_INPROGRESS.
-  . EAI_CANCELED.
-  . EAI_NOTCANCELED.
-  . EAI_ALLDONE.
-  . EAI_INTR.
-  . EAI_IDN_ENCODE.
-  . SO_DETACH_REUSEPORT_BPF (Linux only).
-
-- Sodium:
-  . SODIUM_CRYPTO_IPCRYPT_BYTES.
-  . SODIUM_CRYPTO_IPCRYPT_KEYBYTES.
-  . SODIUM_CRYPTO_IPCRYPT_ND_KEYBYTES.
-  . SODIUM_CRYPTO_IPCRYPT_ND_TWEAKBYTES.
-  . SODIUM_CRYPTO_IPCRYPT_ND_INPUTBYTES.
-  . SODIUM_CRYPTO_IPCRYPT_ND_OUTPUTBYTES.
-  . SODIUM_CRYPTO_IPCRYPT_NDX_KEYBYTES.
-  . SODIUM_CRYPTO_IPCRYPT_NDX_TWEAKBYTES.
-  . SODIUM_CRYPTO_IPCRYPT_NDX_INPUTBYTES.
-  . SODIUM_CRYPTO_IPCRYPT_NDX_OUTPUTBYTES.
-  . SODIUM_CRYPTO_IPCRYPT_PFX_KEYBYTES.
-  . SODIUM_CRYPTO_IPCRYPT_PFX_BYTES.
-  . SODIUM_CRYPTO_XOF_SHAKE128_BLOCKBYTES.
-  . SODIUM_CRYPTO_XOF_SHAKE128_STATEBYTES.
-  . SODIUM_CRYPTO_XOF_SHAKE256_BLOCKBYTES.
-  . SODIUM_CRYPTO_XOF_SHAKE256_STATEBYTES.
-  . SODIUM_CRYPTO_XOF_TURBOSHAKE128_BLOCKBYTES.
-  . SODIUM_CRYPTO_XOF_TURBOSHAKE128_STATEBYTES.
-  . SODIUM_CRYPTO_XOF_TURBOSHAKE256_BLOCKBYTES.
-  . SODIUM_CRYPTO_XOF_TURBOSHAKE256_STATEBYTES.
-  . SODIUM_CRYPTO_KEM_PUBLICKEYBYTES (libsodium >= 1.0.22).
-  . SODIUM_CRYPTO_KEM_SECRETKEYBYTES (libsodium >= 1.0.22).
-  . SODIUM_CRYPTO_KEM_CIPHERTEXTBYTES (libsodium >= 1.0.22).
-  . SODIUM_CRYPTO_KEM_SHAREDSECRETBYTES (libsodium >= 1.0.22).
-  . SODIUM_CRYPTO_KEM_SEEDBYTES (libsodium >= 1.0.22).
-  . SODIUM_CRYPTO_KEM_KEYPAIRBYTES (libsodium >= 1.0.22).
-  . SODIUM_CRYPTO_KEM_MLKEM768_PUBLICKEYBYTES (libsodium >= 1.0.22).
-  . SODIUM_CRYPTO_KEM_MLKEM768_SECRETKEYBYTES (libsodium >= 1.0.22).
-  . SODIUM_CRYPTO_KEM_MLKEM768_CIPHERTEXTBYTES (libsodium >= 1.0.22).
-  . SODIUM_CRYPTO_KEM_MLKEM768_SHAREDSECRETBYTES (libsodium >= 1.0.22).
-  . SODIUM_CRYPTO_KEM_MLKEM768_SEEDBYTES (libsodium >= 1.0.22).
-  . SODIUM_CRYPTO_KEM_MLKEM768_KEYPAIRBYTES (libsodium >= 1.0.22).
-
-- Standard:
-  . ARRAY_FILTER_USE_VALUE.
-  . STREAM_CRYPTO_STATUS_NONE.
-  . STREAM_CRYPTO_STATUS_WANT_READ.
-  . STREAM_CRYPTO_STATUS_WANT_WRITE.
-
 ========================================
 11. Changes to INI File Handling
 ========================================

-- Core:
-  . The error_include_args INI option has been added to make the display of
-    function arguments consistent in errors; it is off by default. Previously,
-    some functions shown a parameter in the error that was up to each call to
-    the internal error function. Now, all parameters as were actually passed to
-    the function will be displayed. This uses the same infrastructure as stack
-    traces, so i.e. sensitive parameters will not be displayed, and strings
-    will be truncated according to zend.exception_string_param_max_len.
-    RFC: https://wiki.php.net/rfc/display_error_function_args
-
-- Mbstring:
-  . The mbstring.detect_order INI directive now updates the internal detection
-    order when changed at runtime via ini_set(). Previously, runtime changes
-    using ini_set() did not take effect for mb_detect_order(). Setting the
-    directive to NULL or an empty string at runtime now leaves the previously
-    configured detection order unchanged.
-
-- MySQLi:
-  . mysqli.default_port now checks the validity of the value which should be
-    between 0 and 65535 inclusive.
-
-- Opcache:
-  . opcache.jit_debug accepts a new flag: ZEND_JIT_DEBUG_TRACE_EXIT_INFO_SRC.
-    When used along with ZEND_JIT_DEBUG_TRACE_EXIT_INFO, the source of exit
-    points is printed in exit info output, in debug builds.
-
 ========================================
 12. Windows Support
 ========================================

-- Core:
-  . The official Windows builds now use Visual Studio 2026 (VS18).
-
-- LibXML:
-  . The libxml2 library used by the official Windows builds has been upgraded
-    to version 2.15.3. As a result, DOMDocument::$documentURI for documents
-    loaded from a local file now contains a native filesystem path instead of
-    a file URI.
-
-- OpenSSL:
-  . The OpenSSL library used by the official Windows builds has been upgraded
-    to OpenSSL 4.
-
 ========================================
 13. Other Changes
 ========================================

-- Core:
-  . In case of a hard OOM PHP now calls abort() instead of exit(1), changing
-    the exit code to 134 and possibly creating a core dump.
-  . The PHP_OS_FAMILY constant has an AIX value for when running on AIX or
-    IBM i via PASE.
-
 ========================================
 14. Performance Improvements
 ========================================
-
-- Core:
-  . printf() using only "%s" and "%d" will be compiled into the equivalent
-    string interpolation, avoiding the overhead of a function call and
-    repeatedly parsing the format string.
-  . Arguments are now passed more efficiently to known constructors (e.g. when
-    using new self()).
-  . array_map() using a first-class callable or partial function application
-    callback will be compiled into the equivalent foreach-loop, avoiding the
-    creation of intermediate Closures, the overhead of calling userland
-    callbacks from internal functions and providing for better insight for the
-    JIT.
-  . The performance of the TAILCALL VM has been improved.
-  . The TAILCALL VM is now enabled on Windows when compiling with Clang >= 19
-    on x86_64.
-  . The performance of ZTS builds has been improved.
-  . Added stateless closure cache.
-    RFC: https://wiki.php.net/rfc/closure-optimizations#stateless_closure_caching
-  . Deeply recursive code that causes the VM to allocate new stack pages should
-    now be faster.
-
-- DOM:
-  . Made splitText() faster and consume less memory.
-
-- GD:
-  . imagebmp(), imagewbmp(), imagegd(), and imagegd2() now buffer output when
-    writing to PHP streams, significantly improving performance when writing
-    images to files.
-  . Improved performance of imagegrabscreen() and imagegrabwindow() on
-    Windows.
-
-- Intl:
-  . Improved performance of IntlCalendar::getAvailableLocales() and
-    IntlDateFormatter::localtime() / datefmt_localtime() by pre-allocating
-    their returned arrays.
-  . Improved performance of transliterator_list_ids() and
-    resourcebundle_locales() by pre-allocating their returned arrays.
-  . Optimized callback invocation in IntlChar::enumCharTypes().
-
-- JSON:
-  . Improve performance of encoding arrays and objects.
-  . Improved performance of indentation generation in json_encode()
-    when using PHP_JSON_PRETTY_PRINT.
-
-- Mbstring:
-  . Improved performance of mb_str_pad().
-
-- Phar:
-  . Reduced temporary allocations when iterating Phar directories.
-
-- Standard:
-  . Improved performance of addcslashes() when generating octal escapes.
-  . Improved performance of sorting single-element arrays.
-  . Improved performance of array_fill_keys().
-  . Improved performance of array_intersect().
-  . Improved performance of array_map() with multiple arrays passed.
-  . Improved performance of array_sum() and array_product() for
-    integer-only arrays.
-  . Improved performance of array_unshift().
-  . Improved performance of array_walk().
-  . Improved performance of intval('+0b...', 2) and intval('0b...', 2).
-  . Improved performance of pathinfo() when requesting a single component.
-  . Improved performance of str_split().
-  . Improved performance of str_pad().
-  . Improved performance of str_repeat() when the multiplier is 1.
-
-- URI:
-  . Improved performance of Uri\WhatWg\Url::parse() when collecting
-    validation errors by pre-allocating the error array.
-  . Reduced allocations when reading IPv6/IPvFuture hosts and paths with
-    Uri\Rfc3986\Uri.
-  . Improved performance and memory consumption when using normalizing
-    (non-raw) getters on already-normalized URIs with Uri\Rfc3986\Uri.
-
-- Zip:
-  . Improved performance of ZipArchive::addGlob() and
-    ZipArchive::addPattern() by pre-allocating their returned arrays.
-  . Avoid string copies in ZipArchive::addFromString().
diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS
index 8bbdc5caabe..41432be1e42 100644
--- a/UPGRADING.INTERNALS
+++ b/UPGRADING.INTERNALS
@@ -1,4 +1,4 @@
-PHP 8.6 INTERNALS UPGRADE NOTES
+PHP 8.7 INTERNALS UPGRADE NOTES

 1. Internal API changes

@@ -14,356 +14,18 @@ PHP 8.6 INTERNALS UPGRADE NOTES
 1. Internal API changes
 ========================

-- Breaking changes:
-  . String formatting functions now support the custom conversion specifiers
-    'pS' (zend_string*) and 'pp' (same as 'p'). Following the 'p' specifier with
-    an alpha-numeric character other than 'S' or 'p' is now an error.
-
-    Examples:
-
-    zend_string *str;
-    zend_spprintf("%pS", str);  // valid, same as "%S"
-    zend_spprintf("%pp", str);  // valid, same as "%p"
-    zend_spprintf("%pA", str);  // invalid
-    zend_spprintf("%ppA", str); // valid, same as zend_spprintf("%p%c", str, 'A')
-
-- Removed:
-  . The misnamed ZVAL_IS_NULL() has been removed. Use Z_ISNULL() instead.
-  . The zval_is_true() alias of zend_is_true() has been removed. Call
-    zend_is_true() directly instead.
-  . The _zval_get_*() compatibility macros for PHP 7.2 have been removed
-    call the variant without the leading underscore instead.
-    Affected: _zval_get_long, _zval_get_double, _zval_get_string,
-    _zval_get_long_func, _zval_get_double_func, _zval_get_string_func
-  . CHECK_ZVAL_NULL_PATH() and CHECK_NULL_PATH() have been removed, use
-    zend_str_has_nul_byte(Z_STR_P(...)) and zend_char_has_nul_byte()
-    respectively.
-  . ZEND_LTOA() (and ZEND_LTOA_BUF_LEN) has been removed, as it was
-    unsafe. Directly use ZEND_LONG_FMT with a function from the
-    printf family.
-  . The zval_dtor() alias of zval_ptr_dtor_nogc() has been removed.
-    Call zval_ptr_dtor_nogc() directly instead.
-  . The internal zend_copy_parameters_array() function is no longer exposed.
-  . The internal zend_hash_minmax() function is no longer exposed. Scan the
-    HashTable directly and use zend_compare() for value comparisons instead.
-  . The zend_make_callable() function has been removed, if a callable zval
-    needs to be obtained use the zend_get_callable_zval_from_fcc() function
-    instead. If this was used to store a callable, then an FCC should be
-    stored instead.
-  . The zend_exception_save() and zend_exception_restore() functions were
-    removed.
-  . The zend_set_hash_symbol() API has been removed.
-  . The WRONG_PARAM_COUNT and ZEND_WRONG_PARAM_COUNT() macros have been
-    removed. Call zend_wrong_param_count(); followed by RETURN_THROWS();
-    instead.
-  . PHP_HAVE_STREAMS macro removed from <php.h>.
-  . The INI_STR(), INI_INT(), INI_FLT(), and INI_BOOL() macros have been
-    removed. Instead new zend_ini_{bool|long|double|str|string}_literal()
-    macros have been added. This fixes an internal naming inconsistency as
-    "str" usually means zend_string*, and "string" means char*.
-    However INI_STR() returned a char*
-  . The INI_ORIG_{INT|STR|FLT|BOOL}() macros have been removed as they are
-    unused. If this behaviour is required fall back to the zend_ini_*
-    functions.
-  . The unused ZEND_AST_PARENT_PROPERTY_HOOK_CALL has been removed.
-  . The EMPTY_SWITCH_DEFAULT_CASE() macro has been removed. Use
-    default: ZEND_UNREACHABLE(); instead.
-  . The ZEND_RESULT_CODE type has been removed. Use zend_result directly.
-  . The zend_parse_parameters_none_throw(), zend_parse_parameters_throw(),
-    and ZEND_PARSE_PARAMS_THROW have been removed due to being misleading,
-    since ZPP always throws, unless ZEND_PARSE_PARAMS_QUIET is given. Use
-    the non-throw versions.
-  . The XtOffsetOf() alias of C’s offsetof() macro has been removed. Use
-    offsetof() directly.
-  . The deprecated Z_COPYABLE(), Z_COPYABLE_P(), Z_OPT_COPYABLE(), and
-    Z_OPT_COPYABLE_P() macros have been removed. Check for IS_ARRAY directly.
-  . The deprecated Z_IMMUTABLE(), Z_IMMUTABLE_P(), Z_OPT_IMMUTABLE(), and
-    Z_OPT_IMMUTABLE_P() macros have been removed. Check for
-    IS_ARRAY && !REFCOUNTED directly.
-  . The unused Z_GC_*() macros have been removed. Use the corresponding
-    GC_*() macro on the result of Z_COUNTED().
-  . The zend_binary_zval_strcmp() and zend_binary_zval_strncmp() functions
-    have been removed, because they are unsafe by relying on the zvals
-    having a specific type. Use zend_binary_strcmp() / zend_binary_strncmp(),
-    string_compare_function() or similar instead.
-  . The OPENBASEDIR_CHECKPATH() compatibility macro has been removed, instead
-    use php_check_open_basedir() directly.
-  . The Z_CONSTANT(), Z_CONSTANT_P(), Z_OPT_CONSTANT(), and
-    Z_OPT_CONSTANT_P() macros have been removed. Check for IS_CONSTANT_AST
-    directly.
-  . The {_}php_stream_fopen_with_path() functions have been removed as they are
-    unused.
-  . The php_error_docref1() and php_error_docref2() functions have been
-    removed, instead rely on the error_include_args INI option to show the
-    arguments to functions in a consistent manner.
-  . The following PHP stream functions prefixed with _ have been removed,
-    and the macro without it has become the canonical function name:
-    * _php_stream_cast()
-    * _php_stream_free_enclosed()
-    * _php_stream_free()
-    * _php_stream_seek()
-    * _php_stream_tell()
-    * _php_stream_read()
-    * _php_stream_write()
-    * _php_stream_fill_read_buffer()
-    * _php_stream_printf()
-    * _php_stream_eof()
-    * _php_stream_getc()
-    * _php_stream_putc()
-    * _php_stream_flush()
-    * _php_stream_sync()
-    * _php_stream_get_line()
-    * _php_stream_puts()
-    * _php_stream_stat()
-    * _php_stream_mkdir()
-    * _php_stream_rmdir()
-    * _php_stream_readdir()
-    * _php_stream_set_option()
-    * _php_stream_get_url_stream_wrappers_hash()
-    * _php_get_stream_filters_hash()
-    * _php_stream_mmap_unmap()
-    * _php_stream_mmap_unmap_ex()
-    * _php_stream_filter_prepend()
-    * _php_stream_filter_append()
-    * _php_stream_filter_flush()
-  . The PHP stream function _php_stream_stat_path() has been renamed to
-    php_stream_stat_path_ex()
-  . The PHP stream function _php_stream_scandir() was removed,
-    insted the PHP macro php_stream_scandir() is now a function as the
-    flags parameter was never used.
-  . The PHP stream function _php_stream_flush() was removed,
-    instead the PHP macro php_stream_flush() is now a proper function.
-  . The zend_save_error_handling() function was removed.
-  . The zend_parse_parameter() function has been removed, use one fo the
-    zend_parse_arg_TYPE() APIs instead.
-  . The zend_is_countable() function was removed.
-
-- Changed:
-  . Internal functions that return by reference are now expected to
-    automatically unwrap references when the result of the call is stored in an
-    IS_TMP_VAR variable. This may be achieved by calling the
-    zend_return_unwrap_ref() function.
-  . ZEND_AST_METHOD_REFERENCE has been renamed to
-    ZEND_AST_TRAIT_METHOD_REFERENCE.
-  . Functions using zend_forbid_dynamic_call() *must* be flagged with
-    ZEND_ACC2_FORBID_DYN_CALLS (@forbid-dynamic-calls in stubs). In debug
-    builds, failing to include that flag will lead to assertion failures.
-  . The zend_get_call_trampoline_func() API now takes the __call or
-    __callStatic zend_function* instead of a CE and a boolean argument.
-  . ZSTR_INIT_LITERAL(), zend_string_starts_with_literal(), and
-    zend_string_starts_with_literal_ci() now support strings containing NUL
-    bytes. Passing non-literal char* is no longer supported.
-  . The zend_active_function{_ex}() functions now return a const zend_function
-    pointer.
-  . zend_function.arg_info is now always a zend_arg_info*. Before, it was a
-    zend_internal_arg_info on internal functions, unless the
-    ZEND_ACC_USER_ARG_INFO flag was set.
-  . ZEND_INI_GET_ADDR() is now a void* pointer instead of a char* pointer. This
-    more correctly represents the generic nature of the returned pointer and
-    allows to remove explicit casts, but possibly breaks pointer arithmetic
-    performed on the result.
-  . The zend_dval_to_lval_cap() function no longer takes a second
-    zend_string* parameter.
-  . EG(in_autoload) was renamed to EG(autoload_current_classnames) and no
-    longer is a pointer, but a directly embedded HashTable struct.
-  . Extended php_stream_filter_ops with seek method.
-  . php_print_info_htmlhead() now takes a title argument.
-  . zend_argument_error_variadic() now takes a new 'function' parameter.
-  . The param argument in the php_verror() function has been removed.
-  . The php_stream_wrapper_log_error() signature changed from
-    (wrapper, options, fmt, ...) to
-    (wrapper, context, options, severity, terminating, code, fmt, ...).
-    To keep the previous behaviour pass NULL for the context, or the context at
-    hand if there is one, E_WARNING for the severity, and
-    ZEND_ENUM_StreamErrorCode_Generic for the code. terminating should be true
-    only if the error aborts the operation.
-  . zend_create_closure(), zend_create_fake_closure() and
-    zend_create_partial_closure() now take the bound $this as a zend_object*
-    instead of a zval*. Accordingly, zend_get_closure_this_ptr() now returns
-    that zend_object*, or NULL when the closure is unbound, instead of a
-    zval* that is IS_UNDEF when the closure is unbound.
-  . object_properties_load() now verifies that the given value is assignable
-    to typed properties. The check is performed in strict mode.
-
-- Added:
-  . New zend_class_entry.ce_flags2 and zend_function.fn_flags2 fields were
-    added, given the primary flags were running out of bits.
-  . Added zend_hash_str_lookup().
-  . Added zend_ast_call_get_args() to fetch the argument node from any call
-    node.
-  . Added Z_PARAM_ENUM().
-  . Added PHP_GD_Z_PARAM_ARRAY_HT_OR_DOUBLE() in ext/gd to parse array|float
-    arguments into either a HashTable pointer or a double.
-  . Added zend_enum_fetch_case_id().
-  . Added zend_enum_get_case_by_id().
-  . Added zend_bin2hex() and zend_bin2hex_str() as helper functions to remove
-    dependencies on /ext/hash in various extensions.
-  . Added a C23_ENUM() helper macro to define forward-compatible fixed-size
-    enums.
-  . Added zend_fcall_info.consumed_args together with
-    zend_fci_consumed_arg(), which allows moving a selected callback argument
-    instead of copying it in zend_call_function(). Currently only a single
-    consumed argument is supported.
-  . Added ZEND_CONTAINER_OF().
-  . Added zend_reflection_property_set_raw_value_without_lazy_initialization(),
-    zend_reflection_property_set_raw_value() to expose the functionality of
-    ReflectionProperty::setRawValueWithoutLazyInitialization() and
-    ReflectionProperty::setRawValue() to C extensions.
-  . Added zend_object_set_properties_reinitable() to centralise temporarily
-    allowing reinitialisation of initialised readonly properties during
-    controlled operations such as cloning and unserialisation.
-  . Added zend_argument_error_ex(), zend_argument_type_error_ex(),
-    zend_argument_value_error_ex().
-  . Added zend_ast_dup().
-  . Added zend_compile_ast().
-  . Added zend_check_type_ex().
-  . Added zend_create_partial_closure().
-  . Added a new IO copy API in <php_io.h>. php_io_copy() copies bytes between
-    file descriptors using the most efficient platform primitive available
-    (sendfile, splice, copy_file_range, TransmitFile), and is now used by
-    php_stream_copy_to_stream_ex(). The mmap-based copy fallback was removed.
-  . Added zend_string_equals_cstr_ci().
-  . Added zend_cstr_append_char(), zend_cstr_concat(), and
-    zend_cstr_concat3() as helper functions to allocate NUL-terminated raw C
-    strings from one or more buffers.
-  . Added zend_string_ends_with() and related variants.
-  . Added trait support for internal classes.
-  . Added do_php_cli().
-  . Added zval_try_get_double(), which converts a defined zval to a double and
-    reports conversion failures through a bool pointer. String conversion uses
-    the numeric-string semantics of zval_try_get_long(), rather than the
-    zend_strtod() semantics of zval_get_double(); non-numeric strings such as
-    "INF" and "NAN" fail, while leading-numeric strings emit E_WARNING. When
-    *failed is true, the returned value must not be used and an exception may
-    already be pending. Passing an IS_UNDEF zval is a caller error.
-
 ========================
 2. Build system changes
 ========================

-- Abstract:
-  . run-tests.php now runs in parallel by default, using up to 10 automatically
-    detected workers. Pass -j1 for sequential execution. --asan, --msan, and
-    Valgrind default to at most two workers.
-  . Minimum required PHP version found on the host system for running scripts
-    like build/gen_stub.php during development has been updated from 7.4 to 8.1.
-  . build/gen_stub.php may now generate a _decl.h file in addition to
-    the _arginfo.h file, if the stub declares enums and is annotated with
-    @generate-c-enums. For each enum the file will contain a C enum. Enum
-    values can be compared to the result of
-    zend_enum_fetch_case_id(zend_object*).
-
-- Unix build system changes:
-  . scripts/dev/update-autoconf.sh has been added to update config.*/libtool.
-  . libtool has been upgraded to 2.5.4 (serial 63), which fixes many bugs.
-  . As part of the upgrade to the new libtool:
-    . libtool is now spread across multiple files. phpize has been updated to
-      handle this.
-    . On macOS, libtool now uses -undefined dynamic_lookup for shared objects,
-      instead of -undefined suppress -flat_namespace.
-    . --with-pic is now --enable-pic. The old flag will result in an error.
-  . Symbol HAVE_ST_BLOCKS has been removed from php_config.h (use
-    HAVE_STRUCT_STAT_ST_BLOCKS).
-  . Added a new configure option --disable-apache2-conf to prevent apxs from
-    editing httpd.conf during installation.
-
-- Windows build system changes:
-  . Function SETUP_OPENSSL() doesn't accept 6th argument anymore and doesn't
-    define the HAVE_OPENSSL_SSL_H preprocessor macro anymore.
-  . Function SETUP_SQLITE3() doesn't define HAVE_SQLITE3_H and HAVE_SQLITE3EXT_H
-    preprocessor macros anymore.
-  . Added a new function CHECK_HEADER() which is intended to be used instead of
-    the CHECK_HEADER_ADD_INCLUDE().
-
-- Embed:
-  . The CLI SAPI can not be disabled when building the embed SAPI
-    (--enable-embed is incompatible with --disable-cli).
-
 ========================
 3. Module changes
 ========================

-- ext/date:
-  . php_idate() now returns the result state, and moves the return value into an
-    out parameter.
-
-- ext/intl:
-  . Added intl_icu_compat.h with helpers and feature macros for ICU
-    version-specific API differences. Code in ext/intl should use the
-    intl_icu_compat_* helpers and INTL_ICU_HAS_* macros instead of adding
-    direct U_ICU_VERSION_* guards for supported ICU API variants.
-  . The internal grapheme_get_break_iterator() helper no longer accepts a
-    stack buffer argument; pass only the UErrorCode* status argument.
-  . Added PHP_INTL_FUNCTION_WITH_ERROR_RESET() for procedural functions that
-    reset the global error. Use it instead of PHP_FUNCTION() followed by a
-    manual intl_error_reset(NULL) call.
-  . IC_METHOD() now resets the global error before entering the method
-    implementation. IntlChar methods should no longer reset it manually.
-
-- ext/mbstring:
-  . Added GB18030-2022 to default encoding list for zh-CN.
-
-- ext/mysqlnd:
-  . Dropped session_options parameter from all methods in mysqlnd_auth.
-    The same information is present in conn->options and should be used
-    instead.
-  . Removed charsets plugin.
-
-- ext/session:
-  . php_session_flush() now returns a bool rather than a zend_result.
-  . The mod_user_names global has been removed.
-  . The mod_user_uses_object_methods_as_handlers global has been added,
-    it indicates whether the session handlers are methods of an object or not.
-  . Removed session_adapt_url().
-  . PS_OPEN_ARGS is now defined as
-    `void **mod_data, zend_string *save_path, zend_string *session_name`
-    rather than
-    `void **mod_data, const char *save_path, const char *session_name`
-  . PS_FUNCS() now includes the PS_VALIDATE_SID_FUNC()
-  . PS_MOD() now requires that the PS_CREATE_SID_FUNC() and
-    PS_VALIDATE_SID_FUNC() functions are defined.
-  . PS_FUNCS_SID() and PS_MOD_SID() have been removed.
-    Either use PS_FUNCS()/PS_MOD() or PS_FUNCS_UPDATE_TIMESTAMP()/
-    PS_MOD_UPDATE_TIMESTAMP() if timestamp support exists.
-
-- ext/standard:
-  . _php_error_log() now has a formal return type of zend_result.
-  . _php_error_log() now accepts zend_string* values instead of char*.
-  . _php_error_log_ex() has been removed.
-  . php_mail()'s extra_cmd parameter is now a zend_string*.
-  . The php_math_round_mode_from_enum() function now takes a
-    zend_enum_RoundingMode parameter.
-
-- ext/uri:
-  . The value parameter of the php_uri_property_handler_write callback is now
-    const zval * instead of zval *, reflecting that write handlers must
-    not modify the input zval.
-
-- ext/xml:
-  . Removed the XML_ExpatVersion() libxml compatibility wrapper,
-    as it was unused.
-  . Removed the XML_GetCurrentByteCount() libxml compatibility wrapper,
-    as it was unused and could return the wrong result.
-
 ========================
 4. OpCode changes
 ========================

-- Added ZEND_TYPE_ASSERT to check a value's type against the parameter
-  type of a function, throwing a TypeError on failure as if the function
-  was called. Used in optimizations that elide function calls.
-
 ========================
 5. SAPI changes
 ========================
-
-- SAPIs should explicitly release a thread's resources by calling
-  ts_free_thread() before terminating it. tsrm_shutdown() can only release the
-  resources of the calling thread, for resources allocated with
-  ts_allocate_tls_id().
-
-- AG and SCNG are now allocated with ts_allocate_tls_id() and live in native
-  __thread storage on ZTS builds.
-
-- php-cli functionality is now available in embed builds via the do_php_cli()
-  function.
diff --git a/Zend/zend.h b/Zend/zend.h
index a0f09432442..6faab635392 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -19,7 +19,7 @@
 #ifndef ZEND_H
 #define ZEND_H

-#define ZEND_VERSION "4.6.0-dev"
+#define ZEND_VERSION "4.7.0-dev"

 #define ZEND_ENGINE_3

diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h
index 1e6887e444a..b8a384a1f54 100644
--- a/Zend/zend_extensions.h
+++ b/Zend/zend_extensions.h
@@ -43,7 +43,7 @@ You can use the following macro to check the extension API version for compatibi

 /* The first number is the engine version and the rest is the date (YYYYMMDD).
  * This way engine 2/3 API no. is always greater than engine 1 API no..  */
-#define ZEND_EXTENSION_API_NO	420250926
+#define ZEND_EXTENSION_API_NO	420260925

 typedef struct _zend_extension_version_info {
 	int zend_extension_api_no;
diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h
index 3a98b1c06e2..bb305092799 100644
--- a/Zend/zend_modules.h
+++ b/Zend/zend_modules.h
@@ -30,7 +30,7 @@
 #define ZEND_MODULE_INFO_FUNC_ARGS zend_module_entry *zend_module
 #define ZEND_MODULE_INFO_FUNC_ARGS_PASSTHRU zend_module

-#define ZEND_MODULE_API_NO 20250926
+#define ZEND_MODULE_API_NO 20260925
 #ifdef ZTS
 #define USING_ZTS 1
 #else
diff --git a/configure.ac b/configure.ac
index b1ff51bcc2d..5a62f91848f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@ dnl Basic autoconf initialization, generation of config.nice.
 dnl ----------------------------------------------------------------------------

 AC_PREREQ([2.68])
-AC_INIT([PHP],[8.6.0-dev],[https://github.com/php/php-src/issues],[php],[https://www.php.net])
+AC_INIT([PHP],[8.7.0-dev],[https://github.com/php/php-src/issues],[php],[https://www.php.net])
 AC_CONFIG_SRCDIR([main/php_version.h])
 AC_CONFIG_MACRO_DIR([build])
 AC_CONFIG_AUX_DIR([build])
diff --git a/docs/release-process.md b/docs/release-process.md
index 2a53a00a277..55bd45279b3 100644
--- a/docs/release-process.md
+++ b/docs/release-process.md
@@ -952,7 +952,6 @@ feature development that cannot go into the new version.
      `Zend/zend.h`, and `win32/build/confutils.js`;
    * update the API version numbers in `Zend/zend_extensions.h`,
      `Zend/zend_modules.h`, and `main/php.h`; and
-   * add the new branch to the list in `CONTRIBUTING.md`.

    See [Prepare for PHP 8.2][] and [Prepare for PHP 8.2 (bis)][] for an example
    of what this commit should include.
diff --git a/main/php.h b/main/php.h
index 275d07309ca..89ceac346b5 100644
--- a/main/php.h
+++ b/main/php.h
@@ -20,7 +20,7 @@
 #include <dmalloc.h>
 #endif

-#define PHP_API_VERSION 20250926
+#define PHP_API_VERSION 20260925
 #define YYDEBUG 0
 #define PHP_DEFAULT_CHARSET "UTF-8"

diff --git a/main/php_version.h b/main/php_version.h
index fa9484cbe15..515f48bb63c 100644
--- a/main/php_version.h
+++ b/main/php_version.h
@@ -1,8 +1,8 @@
 /* automatically generated by configure */
 /* edit configure.ac to change version number */
 #define PHP_MAJOR_VERSION 8
-#define PHP_MINOR_VERSION 6
+#define PHP_MINOR_VERSION 7
 #define PHP_RELEASE_VERSION 0
 #define PHP_EXTRA_VERSION "-dev"
-#define PHP_VERSION "8.6.0-dev"
-#define PHP_VERSION_ID 80600
+#define PHP_VERSION "8.7.0-dev"
+#define PHP_VERSION_ID 80700
diff --git a/win32/build/confutils.js b/win32/build/confutils.js
index 7d9297e8c2d..7c2cab480bf 100644
--- a/win32/build/confutils.js
+++ b/win32/build/confutils.js
@@ -93,10 +93,10 @@ if (typeof(CWD) == "undefined") {
 if (!MODE_PHPIZE) {
 	/* defaults; we pick up the precise versions from configure.ac */
 	var PHP_VERSION = 8;
-	var PHP_MINOR_VERSION = 6;
+	var PHP_MINOR_VERSION = 7;
 	var PHP_RELEASE_VERSION = 0;
 	var PHP_EXTRA_VERSION = "";
-	var PHP_VERSION_STRING = "8.6.0";
+	var PHP_VERSION_STRING = "8.7.0";
 }

 /* Get version numbers and DEFINE as a string */