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 */