diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 53ea64bcfc6..bc13d67d051 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -352,7 +352,8 @@ Currently, we have the following branches in use: | Branch | | | --------- | --------- | -| master | Active development branch for PHP 8.3, which is open for backwards incompatible changes and major internal API changes. | +| master | Active development branch for PHP 8.4, which is open for backwards incompatible changes and major internal API changes. | +| PHP-8.3 | Is used to release the PHP 8.3.x series. This is a current stable version and is open for bugfixes only. | | PHP-8.2 | Is used to release the PHP 8.2.x series. This is a current stable version and is open for bugfixes only. | | PHP-8.1 | Is used to release the PHP 8.1.x series. This is a current stable version and is open for bugfixes only. | | PHP-8.0 | Is used to release the PHP 8.0.x series. This is an old stable version and is open for security fixes only. | diff --git a/UPGRADING b/UPGRADING index 972ba3f48d6..738c11675a9 100644 --- a/UPGRADING +++ b/UPGRADING @@ -1,4 +1,4 @@ -PHP 8.3 UPGRADE NOTES +PHP 8.4 UPGRADE NOTES 1. Backward Incompatible Changes 2. New Features @@ -19,434 +19,26 @@ PHP 8.3 UPGRADE NOTES 1. Backward Incompatible Changes ======================================== -- Core: - . Programs that were very close to overflowing the call stack may now throw an - Error when using more than - `zend.max_allowed_stack_size-zend.reserved_stack_size` bytes of stack - (`fiber.stack_size-zend.reserved_stack_size` for fibers). - . Executing proc_get_status() multiple times will now always return the right - value on posix systems. Previously, only the first call of the function - returned the right value. Executing proc_close() after proc_get_status() - will now also return the right exit code. Previously this would return -1. - Internally, this works by caching the result on posix systems. If you want - the old behaviour, you can check the "cached" key in the array returned by - proc_get_status() to check whether the result was cached. - . Zend Max Execution Timers is now enabled by default for ZTS builds on - Linux. - . Uses of traits with static properties will now redeclare static properties - inherited from the parent class. This will create a separate static - property storage for the current class. This is analogous to adding the - static property to the class directly without traits. - . Assigning a negative index n to an empty array will now make sure that the - next index is n+1 instead of 0. - . Class constant visibility variance is now correctly checked when inherited - from interfaces. - . WeakMaps entries whose key maps to itself (possibly transitively) may now - be removed during cycle collection if the key is not reachable except by - iterating over the WeakMap (reachability via iteration is considered weak). - Previously, such entries would never be automatically removed. - -- DOM: - . DOMChildNode::after(), DOMChildNode::before(), DOMChildNode::replaceWith() - on a node that has no parent is now a no-op instead of a hierarchy - exception, which is the behaviour spec demands. - . Using the DOMParentNode and DOMChildNode methods without a document now - works instead of throwing a HIERARCHY_REQUEST_ERR DOMException. This is in - line with the behaviour spec demands. - . createAttributeNS() without specifying a prefix would incorrectly create - a default namespace, placing the element inside the namespace instead of - the attribute. This bug is now fixed. - . createAttributeNS() would previously incorrectly throw a NAMESPACE_ERR - when the prefix was already used for a different uri. It now correctly - chooses a different prefix when there's a prefix name conflict. - -- FFI: - . C functions that have a return type of void now return null instead of - returning the following object object(FFI\CData:void) { } - -- Opcache: - . The opcache.consistency_checks INI directive was removed. This feature was - broken with the tracing JIT, as well as with inheritance cache, and has - been disabled without a way to enable it since PHP 8.1.18 and PHP 8.2.5. - Both the tracing JIT and inheritance cache may modify shm after the script - has been persisted by invalidating its checksum. The attempted fix skipped - over the modifiable pointers but was rejected due to complexity. For this - reason, it was decided to remove the feature instead. - -- Phar: - . The type of Phar class constants are now declared. - -- Standard: - . The range() function has had various changes: - * A TypeError is now thrown when passing objects, resources, or arrays - as the boundary inputs - * A more descriptive ValueError is thrown when passing 0 for $step - * A ValueError is now thrown when using a negative $step for increasing ranges - * If $step is a float that can be interpreted as an int, it is now done so - * A ValueError is now thrown if any argument is infinity or NAN - * An E_WARNING is now emitted if $start or $end is the empty string. - The value continues to be cast to the value 0. - * An E_WARNING is now emitted if $start or $end has more than one byte, - only if it is a non-numeric string. - * An E_WARNING is now emitted if $start or $end is cast to an integer - because the other boundary input is a number. (e.g. range(5, 'z');) - * An E_WARNING is now emitted if $step is a float when trying to generate - a range of characters, except if both boundary inputs are numeric strings - (e.g. range('5', '9', 0.5); does not produce a warning) - * range() now produce a list of characters if one of the boundary inputs is - a string digit instead of casting the other input to int - (e.g. range('5', 'z');) - . The file() flags error check now catches all invalid flags. Notably - FILE_APPEND was previously silently accepted. - -- SNMP: - . The type of SNMP class constants are now declared. - ======================================== 2. New Features ======================================== -- Core - . Anonymous classes may now be marked as readonly. - . Readonly properties can now be reinitialized during cloning. - RFC: https://wiki.php.net/rfc/readonly_amendments - . Class, interface, trait, and enum constants now support type - declarations. RFC: https://wiki.php.net/rfc/typed_class_constants - . Closures created from magic methods can now accept named arguments. - . The final modifier may now be used when using a method from a trait. - . Added the #[\Override] attribute to check that a method exists - in a parent class or implemented interface. - RFC: https://wiki.php.net/rfc/marking_overriden_methods - . Class constants can now be accessed dynamically using the C::{$name} - syntax. - RFC: https://wiki.php.net/rfc/dynamic_class_constant_fetch - . Static variable initializers can now contain arbitrary expressions. - RFC: https://wiki.php.net/rfc/arbitrary_static_variable_initializers - -- CLI - . It is now possible to lint multiple files. - -- FFI - . It is now possible to assign CData to other CData. This means you can - now assign CData to structs and fields. - -- Opcache - . opcache_get_status()['scripts'][n]['revalidate'] now contains a Unix - timestamp of when the next revalidation of the scripts timestamp is due, - dictated by the opcache.revalidate_freq INI directive. - -- Posix - . posix_getrlimit() now takes an optional $res parameter to allow fetching a - single resource limit. - . posix_isatty() now raises type warnings for integers following the usual - ZPP semantics. - . posix_ttyname() now raises type warnings for integers following the usual - ZPP semantics and value warnings for invalid file descriptor integers. - -- Streams - . Streams can now emit the STREAM_NOTIFY_COMPLETED notification. This was - previously not implemented. - ======================================== 3. Changes in SAPI modules ======================================== -- $_SERVER['SERVER_SOFTWARE'] value from the built-in CLI server changed to - make it compliant with RFC3875. - ======================================== 4. Deprecated Functionality ======================================== -- Core - . Using the ++ operator on empty, non-numeric, or non-alphanumeric strings - is now deprecated. Moreover, incrementing non-numeric strings is soft - deprecated and the new str_increment() function should be used instead. - RFC: https://wiki.php.net/rfc/saner-inc-dec-operators - . Using the -- operator on empty or non-numeric strings is now deprecated. - RFC: https://wiki.php.net/rfc/saner-inc-dec-operators - . Calling get_class() and get_parent_class() without arguments is now - deprecated. - -- DBA - . Calling dba_fetch() with $dba as the 3rd argument is now deprecated. - -- FFI - . Calling FFI::cast(), FFI::new(), and FFI::type() statically is now - deprecated. - -- Intl - . The U_MULTIPLE_DECIMAL_SEP*E*RATORS constant had been deprecated, using - the U_MULTIPLE_DECIMAL_SEP*A*RATORS instead is recommended. - . The NumberFormatter::TYPE_CURRENCY has been deprecated. - -- LDAP - . Calling ldap_connect() with separate hostname and port is deprecated. - RFC: https://wiki.php.net/rfc/deprecations_php_8_3#deprecate_calling_ldap_connect_with_2_parameters - -- MBString - . Passing a negative $width to mb_strimwidth() is now deprecated. - -- Phar - . Calling Phar::setStub() with a resource and a length is now deprecated. - Such calls should be replaced by: - $phar->setStub(stream_get_contents($resource)); - -- Random - . The MT_RAND_PHP Mt19937 variant is deprecated. - RFC: https://wiki.php.net/rfc/deprecations_php_8_3#mt_rand_php - -- Standard: - . The assert_options() function is now deprecated. - . The ASSERT_ACTIVE, ASSERT_BAIL, ASSERT_CALLBACK, ASSERT_EXCEPTION, and - ASSERT_WARNING constants have been deprecated. - RFC: https://wiki.php.net/rfc/assert-string-eval-cleanup - -- SQLite3 - . Using exceptions is now preferred, warnings will be removed in the future. - Calling SQLite3::enableExceptions(false) will trigger a depreciation - warning in this version. - -- Zip: - . The ZipArchive::FL_RECOMPRESS constant is deprecated and will be removed - in a future version of libzip - ======================================== 5. Changed Functions ======================================== -- Core: - . gc_status() has added the following 8 fields: - "running" => bool - "protected" => bool - "full" => bool - "buffer_size" => int - "application_time" => float: Total application time, in seconds (including - collector_time) - "collector_time" => float: Time spent collecting cycles, in seconds - (including destructor_time and free_time) - "destructor_time" => float: Time spent executing destructors during - cycle collection, in seconds - "free_time" => float: Time spent freeing values during cycle collection, in - seconds - See GH-9336, GH-11523 - . class_alias() now supports creating an alias of an internal class. - . Setting `open_basedir` at runtime using `ini_set('open_basedir', ...);` no - longer accepts paths containing the parent directory (`..`). Previously, - only paths starting with `..` were disallowed. This could easily be - circumvented by prepending `./` to the path. - . User exception handlers now catch exceptions during shutdown. - . The resultant HTML of highlight_string and highlight_file has changed. - Whitespace between outer HTML tags is removed. Newlines and spaces - are no longer converted to HTML entities. The whole HTML is now wrapped in -
tag. The outer has been merged with .
-
-- Calendar
- . easter_date() now supports years from 1970 to 2,000,000,000 on 64-bit
- systems, previously it only supported years in the range from 1970 to 2037.
-
-- Curl:
- . curl_getinfo() now supports two new constants: CURLINFO_CAPATH and
- CURLINFO_CAINFO. If option is null, the following two additional keys are
- present: "capath" and "cainfo".
-
-- Dom:
- . Changed DOMCharacterData::appendData() tentative return type to true.
- . DOMDocument::loadHTML(), DOMDocument::loadHTMLFile(),
- DOMDocument::loadXML() and DOMDocument::loadXMLFile() now have a tentative
- return type of bool. Previously, this was documented as having a return
- type of DOMDocument|bool, but DOMDocument cannot be returned since PHP 8.0
- as it is no longer statically callable.
-
-- Gd:
- . Changed imagerotate signature, removed the `ignore_transparent` argument
- as it was not used internally anyway from PHP 7.x.
-
-- Intl:
- . datefmt_set_timezone (and its alias IntlDateformatter::setTimeZone)
- now returns true on success, previously null was returned.
- . IntlBreakiterator::setText() now returns false on failure, previously
- null was returned.
- now returns true on success, previously null was returned.
- . IntlChar::enumCharNames is now returning a boolean.
- Previously it returned null on success and false on failure.
-
-- MBString:
- . mb_strtolower, mb_strtotitle, and mb_convert_case implement conditional
- casing rules for the Greek letter sigma. For mb_convert_case, conditional
- casing only applies to MB_CASE_LOWER and MB_CASE_TITLE modes, not to
- MB_CASE_LOWER_SIMPLE and MB_CASE_TITLE_SIMPLE.
- . mb_decode_mimeheader interprets underscores in QPrint-encoded MIME
- encoded words as required by RFC 2047; they are converted to spaces.
- Underscores must be encoded as "=5F" in such MIME encoded words.
- . In rare cases, mb_encode_mimeheader will transfer-encode its input
- string where it would pass it through as raw ASCII in PHP 8.2.
- . mb_encode_mimeheader no longer drops NUL (zero) bytes when
- QPrint-encoding the input string. This previously caused strings in
- certain text encodings, especially UTF-16 and UTF-32, to be
- corrupted by mb_encode_mimeheader.
- . mb_detect_encoding's "non-strict" mode now behaves as described in the
- documentation. Previously, it would return false if the same byte
- (for example, the first byte) of the input string was invalid in all
- candidate encodings. More generally, it would eliminate candidate
- encodings from consideration when an invalid byte was seen, and if the
- same input byte eliminated all remaining encodings still under
- consideration, it would return false. On the other hand, if all candidate
- encodings but one were eliminated from consideration, it would return the
- last remaining one without regard for how many encoding errors might be
- encountered later in the string. This is different from the behavior
- described in the documentation, which says: "If strict is set to false,
- the closest matching encoding will be returned."
-
-- mysqli:
- . mysqli_fetch_object now raises a ValueError instead of an Exception when
- the constructor_args argument is non empty with the class not having
- constructor.
- . mysqli_poll now raises a ValueError when the read nor error arguments are
- passed.
- . mysqli_field_seek and mysqli_result::field_seek now specify return type
- as true instead of bool.
-
-- ODBC
- . odbc_autocommit() now accepts null for the $enable parameter.
- Passing null has the same behaviour as passing only 1 parameter,
- namely indicating if the autocommit feature is enabled or not.
-
-- PGSQL:
- . pg_fetch_object now raises a ValueError instead of an Exception when the
- constructor_args argument is non empty with the class not having
- constructor.
- . pg_insert now raises a ValueError instead of a WARNING when the table
- specified is invalid.
- . pg_insert and pg_convert raises a ValueError or a TypeError instead of a
- WARNING when the value/type of a field does not match properly with a
- PostGreSQL's type.
- . The $row param of pg_fetch_result(), pg_field_prtlen() and
- pg_field_is_null() is now nullable.
-
-- Random:
- . Changed mt_srand() and srand() to not check the number of arguments to
- determine whether a random seed should be used. Passing null will generate
- a random seed, 0 will use zero as the seed. The functions are now
- consistent with Mt19937::__construct().
-
-- Reflection:
- . Return type of ReflectionClass::getStaticProperties() is no longer nullable.
- . Calling ReflectionProperty::setValue() with only one parameter is deprecated.
- To set static properties, pass null as the first parameter.
-
-- Standard:
- . E_NOTICEs emitted by unserialize() have been promoted to E_WARNING.
- RFC: https://wiki.php.net/rfc/improve_unserialize_error_handling
- . unserialize() now emits a new E_WARNING if the input contains unconsumed
- bytes.
- RFC: https://wiki.php.net/rfc/unserialize_warn_on_trailing_data
- . array_pad() is now only limited by the maximum number of elements an array
- can have. Before, it was only possible to add at most 1048576 elements at a
- time.
- . strtok() raises a warning in the case token is not provided when starting
- tokenization.
- . password_hash() will now chain the underlying Random\RandomException
- as the ValueError’s $previous Exception when salt generation fails.
- . proc_open() $command array must now have at least one non empty element.
- . array_sum() and array_product() now warn when values in the array cannot
- be converted to int/float. Previously arrays and objects where ignored
- whilst every other value was cast to int. Moreover, objects that define
- a numeric cast (e.g. GMP) are now casted instead of ignored.
- RFC: https://wiki.php.net/rfc/saner-array-sum-product
- . number_format() $decimal parameter handles rounding to negative places. It
- means that when $decimals is negative, $num is rounded to $decimals
- significant digits before the decimal point. Previously negative $decimals
- got silently ignored and the number got rounded to zero decimal places.
- . The $before_needle argument added to strrchr() which works in the same way
- like its counterpart in strstr() or stristr().
- . str_getcsv() and fgetcsv() return empty string instead of a string with
- a single zero byte for the last field which contains only unterminated
- enclosure.
-
========================================
6. New Functions
========================================
-- Date:
- . Added DatePeriod::createFromISO8601String() as a replacement for the
- overloaded constructor of DatePeriod.
-
-- DOM:
- . Added DOMNode::contains() and DOMNameSpaceNode::contains().
- . Added DOMElement::getAttributeNames().
- . Added DOMNode::getRootNode(). The $options argument does nothing at the
- moment because it only influences the shadow DOM, which we do not support
- yet.
- . Added DOMElement::className and DOMElement::id.
- This is not binary-safe at the moment because of underlying limitations of
- libxml2.
- . Added DOMParentNode::replaceChildren().
- . Added DOMNode::isConnected and DOMNameSpaceNode::isConnected.
- . Added DOMNode::parentElement and DOMNameSpaceNode::parentElement.
- . Added DOMNode::isEqualNode().
- . Added DOMElement::insertAdjacentElement() and
- DOMElement::insertAdjacentText().
- . Added DOMElement::toggleAttribute().
-
-- Intl:
- . Added IntlCalendar::setDate() and IntlCalendar::setDateTime()
- as partial replacements for the overloaded IntlCalendar::set() method.
- . Added IntlGregorianCalendar::createFromDate() and
- IntlGregorianCalendar::createFromDateTime()
- as partial replacements for the overloaded IntlGregorianCalendar
- constructor.
-
-- JSON:
- . Added json_validate(), which returns whether the json is valid for
- the given $depth and $options.
- RFC: https://wiki.php.net/rfc/json_validate
-
-- LDAP:
- . Added ldap_connect_wallet().
- . Added ldap_exop_sync().
-
-- MBString:
- . Added mb_str_pad(), which is the mbstring equivalent of str_pad().
- RFC: https://wiki.php.net/rfc/mb_str_pad
-
-- Posix:
- . Added posix_sysconf call to get runtime informations.
- . Added posix_pathconf call to get configuration value from a directory/file.
- . Added posix_fpathconf call to get configuration value from a file
- descriptor.
- . Added posix_eaccess call to check the effective user id's permission for
- a path.
-
-- PGSQL:
- . Added pg_set_error_context_visibility to set the visibility of the context
- in error messages (with libpq >= 9.6).
- . Added pg_enter_pipeline_mode().
- . Added pg_exit_pipeline_mode().
- . Added pg_pipeline_sync().
- . Added pg_pipeline_status().
-
-- Random:
- . Added Randomizer::getBytesFromString().
- RFC: https://wiki.php.net/rfc/randomizer_additions
- . Added Randomizer::nextFloat(), ::getFloat(), and IntervalBoundary.
- RFC: https://wiki.php.net/rfc/randomizer_additions
-
-- Reflection:
- . Added ReflectionMethod::createFromMethodName().
-
-- Sockets:
- . Added socket_atmark to checks if the socket is OOB marked.
-
-- Standard:
- . Added the str_increment() and str_decrement() functions.
- RFC: https://wiki.php.net/rfc/saner-inc-dec-operators
- . Added stream_context_set_options() as a replacement for
- stream_context_set_option() when passed an array of options.
-
-- Zip:
- . Added ZipArchive::setArchiveFlag and ZipArchive::getArchiveFlag methods.
-
========================================
7. New Classes and Interfaces
========================================
@@ -459,220 +51,23 @@ PHP 8.3 UPGRADE NOTES
9. Other Changes to Extensions
========================================
-- Core:
- . WeakMaps now have ephemeron-like behavior: Entries whose key maps to itself
- (possibly transitively) may be removed during cycle collection if the key
- is not reachable except by iterating over the WeakMap (reachability via
- iteration is considered weak). Previously, such entries would never be
- automatically removed. (See GH-10932.)
- . The ++ and -- operators now emit warnings when attempting to increment
- values of type bool as this will change in the next major version.
- A warning is emitted when trying to decrement values of type null, as
- this will change in the next major version.
- Internal objects that implement an _IS_NUMBER cast but not a do_operator
- handler that overrides addition and subtraction now can be incremented
- and decrement as if one would do $o += 1 or $o -= 1
-
-- DOM:
- . The DOM lifetime mechanism has been reworked such that implicitly removed
- nodes can still be fetched. Previously this resulted in an exception.
-
-- SQLite3
- . The SQLite3 class now throws \SQLite3Exception (extends \Exception) instead
- of \Exception.
- . The SQLite error code is now passed in the exception error code instead of
- being included in the error message.
-
========================================
10. New Global Constants
========================================
-- Curl:
- . CURLINFO_CAPATH
- . CURLINFO_CAINFO
- . CURLOPT_MIME_OPTIONS
- . CURLMIMEOPT_FORMESCAPE
- . CURLOPT_WS_OPTIONS
- . CURLWS_RAW_MODE
- . CURLOPT_SSH_HOSTKEYFUNCTION
- . CURLOPT_PROTOCOLS_STR
- . CURLOPT_REDIR_PROTOCOLS_STR
- . CURLOPT_CA_CACHE_TIMEOUT
- . CURLOPT_QUICK_EXIT
- . CURLKHMATCH_OK
- . CURLKHMATCH_MISMATCH
- . CURLKHMATCH_MISSING
- . CURLKHMATCH_LAST
-
-- Intl:
- . MIXED_NUMBERS (Spoofchecker).
- . HIDDEN_OVERLAY (Spoofchecker).
-
-- OpenSSL:
- . OPENSSL_CMS_OLDMIMETYPE
- . PKCS7_NOOLDMIMETYPE
-
-- PCNTL:
- . SIGINFO
-
-- PDO_ODBC
- . PDO_ODBC_TYPE
-
-- PGSQL:
- . PGSQL_TRACE_SUPPRESS_TIMESTAMPS
- . PGSQL_TRACE_REGRESS_MODE
- . PGSQL_ERRORS_SQLSTATE
- . PGSQL_PIPELINE_SYNC
- . PGSQL_PIPELINE_ON
- . PGSQL_PIPELINE_OFF
- . PGSQL_PIPELINE_ABORTED
- . PGSQL_SHOW_CONTEXT_NEVER
- . PGSQL_SHOW_CONTEXT_ERRORS
- . PGSQL_SHOW_CONTEXT_ALWAYS
-
-- Posix:
- . POSIX_SC_ARG_MAX
- . POSIX_SC_PAGESIZE
- . POSIX_SC_NPROCESSORS_CONF
- . POSIX_SC_NPROCESSORS_ONLN
- . POSIX_PC_LINK_MAX
- . POSIX_PC_MAX_CANON
- . POSIX_PC_MAX_INPUT
- . POSIX_PC_NAME_MAX
- . POSIX_PC_PATH_MAX
- . POSIX_PC_PIPE_BUF
- . POSIX_PC_CHOWN_RESTRICTED
- . POSIX_PC_NO_TRUNC
- . POSIX_PC_ALLOC_SIZE_MIN
- . POSIX_PC_SYMLINK_MAX
-
-- Sockets:
- . SO_ATTACH_REUSEPORT_CBPF (Linux only).
- . SO_DETACH_BPF (Linux only).
- . SO_DETACH_FILTER (Linux only).
- . TCP_QUICKACK (Linux only).
- . IP_DONTFRAG (FreeBSD only).
- . IP_MTU_DISCOVER (Linux only).
- . IP_PMTUDISC_DO (Linux only).
- . IP_PMTUDISC_DONT (Linux only).
- . IP_PMTUDISC_WANT (Linux only).
- . IP_PMTUDISC_PROBE (Linux only).
- . IP_PMTUDISC_INTERFACE (Linux only).
- . IP_PMTUDISC_OMIT (Linux only).
- . AF_DIVERT (FreeBSD only).
- . SOL_UDPLITE.
- . UDPLITE_RECV_CSCOV.
- . UDPLITE_SEND_CSCOV.
- . SO_RERROR (NetBSD only).
- . SO_ZEROIZE (OpenBSD only).
- . SO_SPLICE (OpenBSD only).
- . TCP_REPAIR (Linux only).
- . SO_REUSEPORT_LB (FreeBSD only).
- . IP_BIND_ADDRESS_NO_PORT (Linux only).
-
-- Zip:
- . ZipArchive::ER_DATA_LENGTH (libzip >= 1.10)
- . ZipArchive::ER_NOT_ALLOWED (libzip >= 1.10)
- . ZipArchive::AFL_RDONLY (libzip >= 1.10)
- . ZipArchive::AFL_IS_TORRENTZIP (libzip >= 1.10)
- . ZipArchive::AFL_WANT_TORRENTZIP (libzip >= 1.10)
- . ZipArchive::AFL_CREATE_OR_KEEP_FILE_FOR_EMPTY_ARCHIVE (libzip >= 1.10)
- . ZipArchive::FL_OPEN_FILE_NOW
- . ZipArchive::LENGTH_TO_END as default value for addFile and replaceFile
- . ZipArchive::LENGTH_UNCHECKED (libzip >= 1.10.1)
-
========================================
11. Changes to INI File Handling
========================================
-- assert.*
- . The assert.* INI settings have been deprecated.
- This comprises the following INI settings:
- - assert.active
- - assert.bail
- - assert.callback
- - assert.exception
- - assert.warning
- If the value of the setting is equal to the default value, no deprecation
- notice is emitted.
- The zend.assertions INI setting should be used instead.
-
-- zend.max_allowed_stack_size
- . New INI directive to set the maximum allowed stack size. Possible
- values are `0` (detect the process or thread maximum stack size), `-1`
- (no limit), or a positive number of bytes. The default is `0`. When it
- is not possible to detect the the process or thread maximum stack size,
- a known system default is used. Setting this value too high has the same
- effect as disabling the stack size limit. Fibers use fiber.stack_size
- as maximum allowed stack size. An Error is thrown when the process call
- stack exceeds `zend.max_allowed_stack_size-zend.reserved_stack_size`
- bytes, to prevent stack-overflow-induced segmentation faults, with
- the goal of making debugging easier. The stack size increases during
- uncontrolled recursions involving internal functions or the magic methods
- __toString, __clone, __sleep, __destruct. This is not related to stack
- buffer overflows, and is not a security feature.
-
-- zend.reserved_stack_size
- . New INI directive to set the reserved stack size, in bytes. This is
- subtracted from the max allowed stack size, as a buffer, when checking the
- stack size.
-
========================================
12. Windows Support
========================================
-- Minimum supported Windows version has been bumped to Windows 8 or
- Windows Server 2012
-
========================================
13. Other Changes
========================================
-- Core:
- . An Error is now thrown when the process call stack exceeds a certain size,
- to prevent stack-overflow-induced segmentation faults, with the goal of
- making debugging easier. The maximum allowed stack size is controlled
- by the INI directives zend.max_allowed_stack_size,
- zend.reserved_stack_size and fiber.stack_size.
-
-- FFI:
- . FFI::load() is now allowed during preloading when opcache.preload_user is
- the current system user. Previously, calling FFI::load() was not possible
- during preloading if the opcache.preload_user directive was set.
-
-- FPM:
- . FPM CLI test now fails if the socket path is longer than supported by OS.
-
-- Opcache:
- . In the cli and phpdbg SAPIs, preloading does not require the
- opcache.preload_user directive to be set anymore when running as root. In
- other SAPIs, this directive is required when running as root because
- preloading is done before the SAPI switches to an unprivileged user.
-
-- Streams:
- . Blocking fread() on socket connection returns immediately if there are
- any buffered data instead of waiting for more data.
- . Memory stream no longer fails if seek offset is past the end. Instead
- the memory is increase on the next write and date between the old end and
- offset is filled with zero bytes in the same way how it works for files.
- . stat() access operations like file_exists() and similar will now use real
- path instead of the actual stream path. This is consistent with stream
- opening.
-
========================================
14. Performance Improvements
========================================
-- DOM:
- . Looping over a DOMNodeList now uses caching. Therefore requesting items no
- longer takes quadratic time by default.
- . Getting text content from nodes now avoids an allocation, resulting in a
- performance gain.
- . DOMChildNode::remove() now runs in O(1) performance.
-
-- Standard:
- . The file() flags error check is now about 7% faster.
-
-- SPL:
- . RecursiveDirectoryIterator now performs less I/O when looping over a
- directory.
diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS
index f35d54846f2..18c651ecfa8 100644
--- a/UPGRADING.INTERNALS
+++ b/UPGRADING.INTERNALS
@@ -1,4 +1,4 @@
-PHP 8.3 INTERNALS UPGRADE NOTES
+PHP 8.4 INTERNALS UPGRADE NOTES
1. Internal API changes
@@ -14,147 +14,14 @@ PHP 8.3 INTERNALS UPGRADE NOTES
1. Internal API changes
========================
-* zend_class_entry now possesses a default_object_handlers field, which
- provides a default object handler when create_object() is not overriding it.
-* Custom Fiber implementations have to initialize EG(stack_limit) and
- EG(stack_base).
-* EG(opline_before_exception) may now be null if the VM throws an exception
- before executing any opline.
-* Many C header files have been cleaned up and include dependencies
- have been reduced. Many headers which used to be always included by
- Zend headers (e.g. "errno.h") are no longer implied, and this may
- break the build of third-party extensions which relied on this
- implementation detail. Those extensions may need to add the missing
- #include lines.
-* Since version 8, PHP requires a C99 compiler. Configure-time checks
- for C99 features have been removed and therefore macro definitions
- from php_config.h have disappeared. Do not use those feature
- macros.
-* Internal class aliases created during request time can now exist in
- the class table. zend_register_class_alias_ex() will not increase
- the refcount for class aliases and the cleanup function takes this
- into account.
-* The return types of the following functions have been changed from
- `bool` to `zend_result`:
- - zend_fiber_init_context()
-* The fast_add_function() has been removed, use add_function() that will
- call the static inline add_function_fast() instead.
-* The order of members of zend_op_array, zend_ssa_var, zend_ssa_var_info,
- zend_executor_globals and php_core_globals have changed to improve
- struct packing which reduces their size.
-* Many calls to zend_assign_to_variable have been replaced with
- zend_assign_to_variable_ex which allows delaying the releasing of the old
- variable value. This avoids side-effects through destructors between the
- assignment of the variable and the assignment to the result zval in the VM
- (i.e. it may free the new value). See GH-10168 for details.
-* The return types of the following functions were changed from int to
- zend_result:
- - open_file_for_scanning
- - php_rfc1867_callback
- - virtual_chdir
- - zend_execute_scripts
- - zend_get_module_started
- - zend_handle_undef_args
- - zend_list_delete
- - zend_multibyte_parse_encoding_list
- - zend_multibyte_set_internal_encoding
- - zend_parse_ini_file
- - zend_parse_ini_string
- - zend_set_user_opcode_handler
- - zend_ssa_inference
-* Removed unused macros PHP_FNV1_32A_INIT and PHP_FNV1A_64_INIT. See GH-11114.
-* ext/standard/hrtime.h was moved to Zend/zend_hrtime.h
- * The prefix of the PHP_HRTIME_ macros was changed to ZEND_HRTIME_
- * The HRTIME_AVAILABLE macro was renamed to ZEND_HRTIME_AVAILABLE
- * The php_hrtime_current() function was renamed to zend_hrtime()
-* _php_stream_dirent now has an extra d_type field that is used to store the
- directory entry type. This can be used to avoid additional stat calls for
- types when the type is already known.
-
========================
2. Build system changes
========================
-* PHP_EXTRA_VERSION can be passed to configure script to control custom PHP
- build versions: ./configure PHP_EXTRA_VERSION="-acme"
-
-* LDFLAGS are not unset anymore allowing them to be adjusted e.g.
- LDFLAGS="..." ./configure
-
-* Removed the HAVE_DEV_URANDOM compile time check. HAVE_DEV_URANDOM will
- now never be defined. Any checks relying on HAVE_DEV_URANDOM should be
- removed. Even with HAVE_DEV_URANDOM it was not guaranteed that
- /dev/urandom is actually available at run time and thus a runtime
- check needs to happen in all cases.
-
========================
3. Module changes
========================
- a. ext/json
- - A new function php_json_validate_ex has been added to check if the
- provided C string is valid for the given depth and options.
-
- b. ext/standard
- - The PHPAPI php_url_encode_hash_ex() function has had its signature change
- from:
- PHPAPI void php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
- const char *num_prefix, size_t num_prefix_len,
- const char *key_prefix, size_t key_prefix_len,
- const char *key_suffix, size_t key_suffix_len,
- zval *type, const char *arg_sep, int enc_type);
- to:
- PHPAPI void php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
- const char *num_prefix, size_t num_prefix_len,
- const zend_string *key_prefix,
- zval *type, const zend_string *arg_sep, int enc_type);
- The change to use zend_string prevent the computation of the arg_sep
- length at each call. The key_suffix parameter was dropped as it was a
- constant value and depended on the key_prefix parameter to not be NULL.
-
- c. ext/mysqlnd
- - The function mysqlnd_shutdown and its corresponding internal methods
- mysqlnd_command::shutdown & mysqlnd_conn_data::shutdown have been removed.
- These functions are deprecated by MySQL in favour of SHUTDOWN SQL statement.
-
- d. ext/pcre
- - The function pcre_get_compiled_regex_ex has been removed.
- Use pcre_get_compiled_regex instead.
-
- e. ext/spl
- - The PHPAPI spl_iterator_apply() function now returns zend_result instead of int.
- There are no functional changes.
- - The field _spl_filesystem_object->is_recursive has been removed.
-
- f. ext/dom
- - A new function dom_get_doc_props_read_only() is added to gather the document
- properties in a read-only way. This function avoids allocation when there are
- no document properties changed yet.
- - The node list returned by DOMNode::getElementsByTagName() and
- DOMNode::getElementsByTagNameNS() now caches the length and the last requested item.
- This means that the length and the last requested item are not recalculated
- when the node list is iterated over multiple times.
- If you do not use the internal PHP dom APIs to modify the document, you need to
- manually invalidate the cache using php_libxml_invalidate_node_list_cache_from_doc().
- Furthermore, the following internal APIs were added to handle the cache:
- . php_dom_is_cache_tag_stale_from_doc_ptr()
- . php_dom_is_cache_tag_stale_from_node()
- . php_dom_mark_cache_tag_up_to_date_from_node()
- - The function dom_get_elements_by_tag_name_ns_raw() has an additional parameter to indicate
- the base node of the node list. This function also no longer accepts -1 as the index argument.
- - The function dom_namednode_iter() has additional arguments to avoid recomputing the length of
- the strings.
- - The functions dom_parent_node_prepend(), dom_parent_node_append(), dom_parent_node_after(), and
- dom_parent_node_before() now use an uint32_t argument for the number of nodes instead of int.
- - There is now a helper function php_dom_get_content_into_zval() to get the contents of a node.
- This avoids allocation if possible.
- - The function dom_set_old_ns() has been moved into ext/libxml as php_libxml_set_old_ns() and
- is now publicly exposed as an API.
-
- g. ext/libxml
- - Two new functions: php_libxml_invalidate_node_list_cache_from_doc() and
- php_libxml_invalidate_node_list_cache() were added to invalidate the cache of a node list.
-
========================
4. OpCode changes
========================
@@ -162,6 +29,3 @@ PHP 8.3 INTERNALS UPGRADE NOTES
========================
5. SAPI changes
========================
-
-* SAPIs that may execute in alternative stacks have to set EG(stack_limit) and
- EG(stack_base)
diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h
index 461358abd2b..1ef2d978196 100644
--- a/Zend/zend_extensions.h
+++ b/Zend/zend_extensions.h
@@ -44,7 +44,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 420230831
+#define ZEND_EXTENSION_API_NO 420230901
typedef struct _zend_extension_version_info {
int zend_extension_api_no;
diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h
index 09661e6a2b8..8c90e763a12 100644
--- a/Zend/zend_modules.h
+++ b/Zend/zend_modules.h
@@ -31,7 +31,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 20230831
+#define ZEND_MODULE_API_NO 20230901
#ifdef ZTS
#define USING_ZTS 1
#else
diff --git a/main/php.h b/main/php.h
index 7237f55796f..79b73b68d1f 100644
--- a/main/php.h
+++ b/main/php.h
@@ -22,7 +22,7 @@
#include
#endif
-#define PHP_API_VERSION 20230831
+#define PHP_API_VERSION 20230901
#define PHP_HAVE_STREAMS
#define YYDEBUG 0
#define PHP_DEFAULT_CHARSET "UTF-8"
diff --git a/win32/build/confutils.js b/win32/build/confutils.js
index 359c751b7bb..8f8c3d4ca57 100644
--- a/win32/build/confutils.js
+++ b/win32/build/confutils.js
@@ -95,10 +95,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 = 3;
+ var PHP_MINOR_VERSION = 4;
var PHP_RELEASE_VERSION = 0;
var PHP_EXTRA_VERSION = "";
- var PHP_VERSION_STRING = "8.3.0";
+ var PHP_VERSION_STRING = "8.4.0";
}
/* Get version numbers and DEFINE as a string */