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 + + + + +