diff --git a/appendices/migration83.xml b/appendices/migration83.xml
new file mode 100644
index 000000000000..0e6925c2474e
--- /dev/null
+++ b/appendices/migration83.xml
@@ -0,0 +1,54 @@
+
+
+ Migrating from PHP 8.2.x to PHP 8.3.x
+
+ &appendices.migration83.new-features;
+ &appendices.migration83.new-classes;
+ &appendices.migration83.new-functions;
+ &appendices.migration83.constants;
+ &appendices.migration83.incompatible;
+ &appendices.migration83.deprecated;
+ &appendices.migration83.other-changes;
+ &appendices.migration83.windows-support;
+
+
+
+ This new minor version brings with it a number of
+ new features and a
+ few incompatibilities
+ that should be tested for before switching PHP versions in production
+ environments.
+
+
+
+ &manual.migration.seealso;
+ 7.1.x,
+ 7.2.x,
+ 7.3.x,
+ 7.4.x,
+ 8.0.x,
+ 8.1.x.
+ 8.2.x.
+
+
+
+
diff --git a/appendices/migration83/constants.xml b/appendices/migration83/constants.xml
new file mode 100644
index 000000000000..716afe057ee4
--- /dev/null
+++ b/appendices/migration83/constants.xml
@@ -0,0 +1,337 @@
+
+
+ New Global Constants
+
+
+ cURL
+
+
+
+
+ CURLINFO_CAPATH (libcurl >= 7.84.0)
+
+
+
+
+ CURLINFO_CAINFO (libcurl >= 7.84.0)
+
+
+
+
+ CURLOPT_MIME_OPTIONS (libcurl >= 7.81.0)
+
+
+
+
+ CURLMIMEOPT_FORMESCAPE (libcurl >= 7.81.0)
+
+
+
+
+ CURLOPT_WS_OPTIONS (libcurl >= 7.86.0)
+
+
+
+
+ CURLWS_RAW_MODE (libcurl >= 7.86.0)
+
+
+
+
+ CURLOPT_SSH_HOSTKEYFUNCTION (libcurl >= 7.84.0)
+
+
+
+
+ CURLOPT_PROTOCOLS_STR (libcurl >= 7.85.0)
+
+
+
+
+ CURLOPT_REDIR_PROTOCOLS_STR (libcurl >= 7.85.0)
+
+
+
+
+ CURLOPT_CA_CACHE_TIMEOUT (libcurl >= 7.87.0)
+
+
+
+
+ CURLOPT_QUICK_EXIT (libcurl >= 7.87.0)
+
+
+
+
+ CURLKHMATCH_OK (libcurl >= 7.19.6)
+
+
+
+
+ CURLKHMATCH_MISMATCH (libcurl >= 7.19.6)
+
+
+
+
+ CURLKHMATCH_MISSING (libcurl >= 7.19.6)
+
+
+
+
+ CURLKHMATCH_LAST (libcurl >= 7.19.6)
+
+
+
+
+
+
+ Intl
+
+
+
+ MIXED_NUMBERS
+ (Spoofchecker)
+
+
+ HIDDEN_OVERLAY
+ (Spoofchecker)
+
+
+
+
+
+ OpenSSL
+
+
+
+ OPENSSL_CMS_OLDMIMETYPE
+
+
+ PKCS7_NOOLDMIMETYPE
+
+
+
+
+
+ PCNTL
+
+
+
+ SIGINFO
+
+
+
+
+
+ PDO_ODBC
+
+
+
+ PDO_ODBC_TYPE
+
+
+
+
+
+ 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
+
+
+ The following socket options are now defined if they are supported:
+
+
+
+
+ SO_ATTACH_REUSEPORT_CBPF (Linux)
+
+
+ SO_DETACH_BPF (Linux)
+
+
+ SO_DETACH_FILTER (Linux)
+
+
+ TCP_QUICKACK (Linux)
+
+
+ IP_DONTFRAG (FreeBSD)
+
+
+ IP_MTU_DISCOVER (Linux)
+
+
+ IP_PMTUDISC_DO (Linux)
+
+
+ IP_PMTUDISC_DONT (Linux)
+
+
+ IP_PMTUDISC_WANT (Linux)
+
+
+ IP_PMTUDISC_PROBE (Linux)
+
+
+ IP_PMTUDISC_INTERFACE (Linux)
+
+
+ IP_PMTUDISC_OMIT (Linux)
+
+
+ AF_DIVERT (FreeBSD)
+
+
+ SOL_UDPLITE
+
+
+ UDPLITE_RECV_CSCOV
+
+
+ UDPLITE_SEND_CSCOV
+
+
+
+ SO_RERROR (NetBSD)
+
+
+ SO_ZEROIZE (OpenBSD)
+
+
+ SO_SPLICE (OpenBSD)
+
+
+ TCP_REPAIR (Linux)
+
+
+ SO_REUSEPORT_LB (FreeBSD)
+
+
+ IP_BIND_ADDRESS_NO_PORT (Linux)
+
+
+
+
+
+ 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
+ ZipArchive::addFile and
+ ZipArchive::replaceFile
+
+
+
+
+ ZipArchive::LENGTH_UNCHECKED (libzip >= 1.10)
+
+
+
+
+
+
+
diff --git a/appendices/migration83/deprecated.xml b/appendices/migration83/deprecated.xml
new file mode 100644
index 000000000000..9ee2644676c1
--- /dev/null
+++ b/appendices/migration83/deprecated.xml
@@ -0,0 +1,177 @@
+
+
+ Deprecated Features
+
+
+ PHP Core
+
+
+ Saner Increment/Decrement operators
+
+
+ Using the increment
+ 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.
+
+
+
+ Using the decrement
+ operator (--) on empty or non-numeric strings is now deprecated.
+
+
+
+
+
+ get_class()/get_parent_class() call without arguments
+
+
+ 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
+ constant instead is recommended.
+
+
+ The NumberFormatter::TYPE_CURRENCY constant has been deprecated.
+
+
+
+
+ LDAP
+
+
+ Calling ldap_connect with separate hostname and port is
+ deprecated.
+
+
+
+
+
+ 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.
+
+
+
+
+
+ Reflection
+
+
+ Calling ReflectionProperty::setValue with only one
+ parameter is deprecated.
+ To set static properties, pass &null; as the first parameter.
+
+
+
+
+ Standard
+
+
+ The assert_options function is now deprecated.
+
+
+ The ASSERT_ACTIVE, ASSERT_BAIL,
+ ASSERT_CALLBACK, ASSERT_EXCEPTION,
+ and ASSERT_WARNING constants have been deprecated.
+
+
+
+ The assert.* INI settings have been deprecated.
+ See the
+ Changes to INI File Handling
+ page for further details.
+
+
+
+
+
+ SQLite3
+
+
+ Using exceptions is now preferred, warnings will be removed in the future.
+ Calling SQLite3::enableExceptions(false) will trigger a
+ deprecation warning in this version.
+
+
+
+
+ Zip
+
+
+ The ZipArchive::FL_RECOMPRESS constant is deprecated
+ and will be removed in a future version of libzip.
+
+
+
+
+
diff --git a/appendices/migration83/incompatible.xml b/appendices/migration83/incompatible.xml
new file mode 100644
index 000000000000..e884727971c0
--- /dev/null
+++ b/appendices/migration83/incompatible.xml
@@ -0,0 +1,238 @@
+
+
+ Backward Incompatible Changes
+
+
+ PHP Core
+
+
+
+ Programs that were very close to overflowing the call stack
+
+ 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
+
+ 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 the previous behaviour is required, it is possible to check the
+ "cached" key in the array returned by
+ proc_get_status to check whether the result was cached.
+
+
+
+
+ Zend Max Execution Timers
+
+ Zend Max Execution Timers is now enabled by default for ZTS builds on
+ Linux.
+
+
+
+
+ Uses of traits with static properties
+
+ 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 to an empty array
+
+ 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 check
+
+ Class constant visibility variance is now correctly checked when inherited
+ from interfaces.
+
+
+
+
+ WeakMap entries whose key maps to itself
+
+ WeakMap 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
+
+
+ Calling 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 demanded by the DOM specification.
+
+
+
+ Using the DOMParentNode
+ and DOMChildNode methods without a document now
+ works instead of throwing a DOM_HIERARCHY_REQUEST_ERR
+ DOMException.
+ This is in line with the behaviour demanded by the DOM specification.
+
+
+
+ Calling DOMDocument::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.
+
+
+
+ DOMDocument::createAttributeNS would previously
+ incorrectly throw a DOM_NAMESPACE_ERRNAMESPACE_ERR
+ DOMException when the prefix was already used for a
+ different URI. It now correctly chooses a different prefix when there's a
+ prefix name conflict.
+
+
+
+ New methods and properties were added to some DOM classes.
+ If a userland class inherits from these classes and declare a method or property
+ with the same name, the declarations must be compatible. Otherwise, a typical
+ compile error about incompatible declarations will be thrown.
+ See the list of new features
+ and new functions for
+ a list of the newly implemented methods and properties.
+
+
+
+
+ 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('9', 'A');).
+
+
+
+
+", "?", "@", "A"], as of PHP 8.3.0
+range('9', 'A'); // [9, 8, 7, 6, 5, 4, 3, 2, 1, 0], prior to PHP 8.3.0
+?>
+]]>
+
+
+
+
+
+ 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.
+
+
+
+
+
diff --git a/appendices/migration83/new-classes.xml b/appendices/migration83/new-classes.xml
new file mode 100644
index 000000000000..00c84e36945b
--- /dev/null
+++ b/appendices/migration83/new-classes.xml
@@ -0,0 +1,40 @@
+
+
+
+
+ New Classes and Interfaces
+
+
+ Random
+
+
+
+
+ Random\IntervalBoundary
+
+
+
+
+
+
+
+
diff --git a/appendices/migration83/new-features.xml b/appendices/migration83/new-features.xml
new file mode 100644
index 000000000000..b4815f3c5d3e
--- /dev/null
+++ b/appendices/migration83/new-features.xml
@@ -0,0 +1,177 @@
+
+
+ New Features
+
+
+ PHP Core
+
+
+ Readonly Amendments
+
+
+ Anonymous classes may now be marked as readonly.
+
+
+
+ Readonly properties can now be reinitialized during cloning.
+
+
+
+
+
+ Typed Class Constants
+
+
+ Class, interface, trait, and enum constants now support type declarations.
+
+
+
+
+
+ Closures created from magic methods
+
+
+ Closures created from magic methods can now accept named arguments.
+
+
+
+
+ The final modifier with a method from a trait
+
+
+ The final modifier may now be used when using a method from a trait.
+
+
+
+
+ Override Attribute
+
+
+ Added the #[\Override] attribute to check that a method exists in a parent
+ class or implemented interface.
+
+
+
+
+
+ Fetch class constant dynamically syntax
+
+
+ Class constants can now be accessed dynamically using the
+ C::{$name} syntax.
+
+
+
+
+
+ Static variable Initializers
+
+
+ Static variable initializers can now contain arbitrary expressions.
+
+
+
+
+
+
+
+ CLI
+
+
+ It is now possible to lint multiple files.
+
+
+
+
+ DOM
+
+
+ Added properties DOMElement::$className
+ and DOMElement::$id.
+ These are not binary-safe at the moment because of underlying limitations
+ of libxml2.
+ This means that the property values will be cut off at a NUL byte.
+
+
+
+ Added properties DOMNode::$isConnected
+ and DOMNameSpaceNode::$isConnected.
+
+
+
+ Added properties DOMNode::$parentElement
+ and DOMNameSpaceNode::$parentElement.
+
+
+
+
+ FFI
+
+
+ It is now possible to assign FFI\CData to other FFI\CData.
+ Meaning CData can now be assigned 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.
+
+
+
+
+
diff --git a/appendices/migration83/new-functions.xml b/appendices/migration83/new-functions.xml
new file mode 100644
index 000000000000..9c9f2da7af02
--- /dev/null
+++ b/appendices/migration83/new-functions.xml
@@ -0,0 +1,163 @@
+
+
+ New Functions
+
+
+ Date
+
+
+ DatePeriod::createFromISO8601String
+
+
+
+
+ DOM
+
+
+ DOMElement::getAttributeNames
+
+ DOMElement::insertAdjacentElement
+
+ DOMElement::insertAdjacentText
+
+ DOMElement::toggleAttribute
+
+ DOMNode::contains
+
+ DOMNode::getRootNode
+
+ DOMNode::isEqualNode
+
+ DOMNameSpaceNode::contains
+
+ DOMParentNode::replaceChildren
+
+
+
+
+ Intl
+
+
+ IntlCalendar::setDate
+
+ IntlCalendar::setDateTime
+
+ IntlGregorianCalendar::createFromDate
+
+ IntlGregorianCalendar::createFromDateTime
+
+
+
+
+ JSON
+
+ json_validate
+
+
+
+
+
+ LDAP
+
+ ldap_connect_wallet
+ ldap_exop_sync
+
+
+
+
+ MBString
+
+ mb_str_pad
+
+
+
+
+
+ Posix
+
+ posix_sysconf
+ posix_pathconf
+ posix_fpathconf
+ posix_eaccess
+
+
+
+
+ PostgreSQL
+
+ pg_set_error_context_visibility
+ (libpq >= 9.6)
+ pg_enter_pipeline_mode
+ pg_exit_pipeline_mode
+ pg_pipeline_sync
+ pg_pipeline_status
+
+
+
+
+ Random
+
+
+
+ Random\Randomizer::getBytesFromString
+
+ Random\Randomizer::nextFloat
+
+ Random\Randomizer::getFloat
+
+
+
+
+ Reflection
+
+
+ ReflectionMethod::createFromMethodName
+
+
+
+
+ Sockets
+
+ socket_atmark
+
+
+
+
+ Standard
+
+ str_increment
+ str_decrement
+
+ stream_context_set_options
+
+
+
+
+ Zip
+
+
+ ZipArchive::getArchiveFlag
+
+
+
+
+
diff --git a/appendices/migration83/other-changes.xml b/appendices/migration83/other-changes.xml
new file mode 100644
index 000000000000..18c11e910b98
--- /dev/null
+++ b/appendices/migration83/other-changes.xml
@@ -0,0 +1,575 @@
+
+
+ Other Changes
+
+
+ Core changes
+
+
+ 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.
+ FPM CLI test now fails if the socket path is longer than supported by OS.
+
+
+
+
+ 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.
+
+
+
+
+
+ Changes in SAPI Modules
+
+
+ CLI
+
+
+ The STDOUT, STDERR and
+ STDIN streams are no longer closed on resource
+ destruction which is mostly when the CLI finishes.
+ It is however still possible to explicitly close those streams using
+ fclose and similar.
+
+
+
+
+
+ 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
+
+
+
+
+ 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 a
+ <pre> tag. The outer <span>
+ tag has been merged with the <code> tag.
+
+
+
+
+
+ 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, as of PHP 8.0.0,
+ DOMDocument
+ cannot be returned as it is no longer statically callable.
+
+
+
+
+
+ Gd
+
+
+ The signature of imagerotate has changed.
+ The ignore_transparent parameter has been removed,
+ as it was ignored since PHP 5.5.0.
+
+
+
+
+ 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 neither the read
+ nor the error arguments are passed.
+
+
+
+ mysqli_field_seek and
+ mysqli_result::field_seek now specify the 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 E_WARNING when the table specified is invalid.
+
+
+
+ pg_insert and pg_convert raises
+ a ValueError or a TypeError
+ instead of a E_WARNING when the value/type of a field
+ does not match properly with a PostgreSQL's type.
+
+
+
+ The $row parameter 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
+ Random\Engine\Mt19937::__construct.
+
+
+
+
+
+ Reflection
+
+
+ Return type of ReflectionClass::getStaticProperties
+ is no longer nullable.
+
+
+
+
+ Standard
+
+
+ E_NOTICEs emitted by unserialize
+ have been promoted to E_WARNING.
+
+
+
+
+ unserialize now emits a new E_WARNING
+ if the input contains unconsumed bytes.
+
+
+
+
+ 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 an E_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.
+
+
+
+ If using an array as the $command
+ for proc_open, it must now have at least one
+ non empty element. Otherwise a ValueError
+ is thrown.
+
+
+
+ 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.
+
+
+
+
+ The $decimal of number_format
+ now properly handles negative integers.
+ Rounding with a negative value for $decimal means
+ that $num is rounded to $decimals
+ significant digits before the decimal point.
+ Previously negative $decimals were silently
+ ignored and the number got rounded to zero decimal places.
+
+
+
+ A new $before_needle argument has been added to
+ strrchr. It behaves like its counterpart in the
+ strstr or stristr functions.
+
+
+
+ str_getcsv and fgetcsv now return
+ an empty string instead of a string with a single null byte for the last field
+ which only contains an unterminated enclosure.
+
+
+
+
+
+
+ Other Changes to Extensions
+
+
+ Core
+
+
+ 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.
+
+
+
+
+
+
+ Changes to INI File Handling
+
+
+
+
+ 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
+ is a 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
+ is a 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.
+
+
+
+
+
+
+ Performance
+
+
+ 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/appendices/migration83/windows-support.xml b/appendices/migration83/windows-support.xml
new file mode 100644
index 000000000000..ebb9105f7966
--- /dev/null
+++ b/appendices/migration83/windows-support.xml
@@ -0,0 +1,34 @@
+
+
+ Windows Support
+
+
+ Core
+
+
+ Minimum supported Windows version has been bumped to Windows 8 or
+ Windows Server 2012
+
+
+
+
+