xref: /PHP-8.2/UPGRADING (revision 33967aef)
1PHP 8.2 UPGRADE NOTES
2
31. Backward Incompatible Changes
42. New Features
53. Changes in SAPI modules
64. Deprecated Functionality
75. Changed Functions
86. New Functions
97. New Classes and Interfaces
108. Removed Extensions and SAPIs
119. Other Changes to Extensions
1210. New Global Constants
1311. Changes to INI File Handling
1412. Windows Support
1513. Other Changes
1614. Performance Improvements
17
18========================================
191. Backward Incompatible Changes
20========================================
21
22- Date:
23  . DateTime::createFromImmutable() now has a tentative return type of static,
24    previously it was DateTime.
25  . DateTimeImmutable::createFromMutable() now has a tentative return type of
26    static, previously it was DateTimeImmutable.
27
28- ODBC:
29  . The ODBC extension now escapes the username and password for the case when
30    both a connection string and username/password are passed, and the string
31    must be appended to. Before, user values containing values needing escaping
32    could have created a malformed connection string, or injected values from
33    user-provided data. The escaping rules should be identical to the .NET BCL
34    DbConnectionOptions behaviour.
35
36- PDO_ODBC:
37  . The PDO_ODBC extension also escapes the username and password when a
38    connection string is passed. See the change to the ODBC extension for
39    further details.
40
41- Standard:
42  . glob() returns empty array if all paths are restricted by open_basedir.
43    Previously the error was returned but that behavior was not consistent and
44    did not work correctly for all patterns.
45  . strtolower() and strtoupper() are no longer locale-sensitive. They now
46    perform ASCII case conversion, as if the locale were "C". Use
47    mb_strtolower() if you want localized case conversion. Similarly, stristr,
48    stripos, strripos, lcfirst, ucfirst, ucwords, str_ireplace,
49    array_change_key_case and sorting with SORT_FLAG_CASE use ASCII case
50    conversion.
51  . str_split() returns an empty array for an empty string now. Previously it
52    returned an array with a single empty string entry. mb_str_split() is not
53    affected by this change since it was already behaving like that.
54  . ksort() and krsort() do numeric string comparison under SORT_REGULAR using
55    the standard PHP 8 rules now.
56
57- SPL:
58  . The following methods now enforce their signature:
59    * SplFileInfo::_bad_state_ex()
60    * SplFileObject::getCsvControl()
61    * SplFileObject::fflush()
62    * SplFileObject::ftell()
63    * SplFileObject::fgetc()
64    * SplFileObject::fpassthru()
65  . SplFileObject::hasChildren() now has a tentative return type of false,
66    previously it was bool
67  . SplFileObject::getChildren() now has a tentative return type of null,
68    previously it was ?RecursiveIterator
69  . GlogIterator returns empty array if all paths are restricted by
70    open_basedir. Previously the error was returned but that behavior was not
71    consistent and did not work correctly.
72
73========================================
742. New Features
75========================================
76
77- Core:
78  . Added the #[\SensitiveParameter] attribute to redact sensitive data in
79    backtraces.
80    RFC: https://wiki.php.net/rfc/redact_parameters_in_back_traces
81  . It is now possible to use null and false as standalone types.
82    RFC: https://wiki.php.net/rfc/null-false-standalone-types
83  . Added support for readonly classes.
84    RFC: https://wiki.php.net/rfc/readonly_classes
85  . Added support for true type.
86    RFC: https://wiki.php.net/rfc/true-type
87  . Added support for Disjoint Normal Form (DNF) types.
88    RFC: https://wiki.php.net/rfc/dnf_types
89  . Added error_log_mode ini setting that allows setting of permissions for
90    error log file.
91  . Added support for fetching properties of enums in constant expressions.
92    RFC: https://wiki.php.net/rfc/fetch_property_in_const_expressions
93  . Added support for defining constants in traits.
94    RFC: https://wiki.php.net/rfc/constants_in_traits
95
96- Curl:
97  . Added CURLINFO_EFFECTIVE_METHOD option and returning the effective
98    HTTP method in curl_getinfo() return value.
99  . Exposed multiple new constants from libcurl 7.62 to 7.80.
100  . Added new function curl_upkeep() to perform any connection upkeep checks.
101
102- DBA:
103  . The LMDB Driver now accepts the DBA_LMDB_USE_SUB_DIR or DBA_LMDB_NO_SUB_DIR
104    flags to determine if it should create a sub directory or not when creating
105    a database file.
106
107- GMP:
108  . GMP::__construct() can now be used instead of gmp_init() to initialize an object (Only as of PHP 8.2.3)
109
110
111- OCI8:
112  . Added an oci8.prefetch_lob_size directive and oci_set_prefetch_lob()
113    function to tune LOB query performance by reducing the number of
114    round-trips between PHP and Oracle Database when fetching LOBS. This is
115    usable with Oracle Database 12.2 or later.
116
117- OpenSSL:
118  . Added AEAD support for chacha20-poly1305 algorithm.
119
120- ODBC:
121  . Added odbc_connection_string_is_quoted, odbc_connection_string_should_quote,
122    and odbc_connection_string_quote. These are primarily used behind the scenes
123    in the ODBC and PDO_ODBC extensions, but is exposed to userland for easier
124    unit testing, and for user applications and libraries to perform quoting
125    themselves.
126
127- PCRE:
128  . Added support for the "n" (NO_AUTO_CAPTURE) modifier, which makes simple
129    `(xyz)` groups non-capturing. Only named groups like `(?<name>xyz)` are
130    capturing. This only affects which groups are capturing, it is still
131    possible to use numbered subpattern references, and the matches array will
132    still contain numbered results.
133
134- Random:
135  . New extension that organizes and consolidates existing implementations
136    related to random number generators. New, higher quality RNGs are available
137    and scope issues are eliminated.
138    RFC: https://wiki.php.net/rfc/rng_extension
139    RFC: https://wiki.php.net/rfc/random_extension_improvement
140
141========================================
1423. Changes in SAPI modules
143========================================
144
145- FPM:
146  . If setting user by its UID without setting a group, then the group is no
147    longer set to 0 (root) but instead to the user assigned groups like it is
148    when setting user by name.
149
150========================================
1514. Deprecated Functionality
152========================================
153
154- Core:
155  . Creation of dynamic properties is deprecated, unless the class opts in by
156    using the #[AllowDynamicProperties] attribute. stdClass allows dynamic
157    properties. Usage of __get()/__set() is not affected by this change. A
158    dynamic properties deprecation warning can be addressed by:
159     - Declaring the property (preferred).
160     - Adding the #[AllowDynamicProperties] attribute to the class (which also
161       applies to all child classes).
162     - Using a WeakMap if you wish to associate additional data with an object
163       you do not own.
164
165  . Callables that are not accepted by the $callable() syntax (but are accepted
166    by call_user_func) are deprecated. In particular:
167
168        "self::method"
169        "parent::method"
170        "static::method"
171        ["self", "method"]
172        ["parent", "method"]
173        ["static", "method"]
174        ["Foo", "Bar::method"]
175        [new Foo, "Bar::method"]
176
177    This does not affect normal method callables like "A::method" or
178    ["A", "method"].
179
180    RFC: https://wiki.php.net/rfc/deprecate_partially_supported_callables
181    RFC: https://wiki.php.net/rfc/partially-supported-callables-expand-deprecation-notices
182
183  . The "${var}" and "${expr}" style string interpolations are deprecated and
184    will be removed in PHP 9. Use "$var"/"{$var}" or "{${expr}}", respectively.
185    RFC: https://wiki.php.net/rfc/deprecate_dollar_brace_string_interpolation
186
187- Mbstring:
188  . Use of QPrint, Base64, Uuencode, and HTML-ENTITIES 'text encodings' is
189    deprecated for all Mbstring functions. Unlike all the other text
190    encodings supported by Mbstring, these do not encode a sequence of
191    Unicode codepoints, but rather a sequence of raw bytes. It is not
192    clear what the correct return values for most Mbstring functions should
193    be when one of these non-encodings is specified. Further, PHP has
194    separate, built-in implementations of all of them; for example, UUencoded
195    data can be handled using convert_uuencode/convert_uudecode.
196
197- SPL:
198  . The SplFileInfo::_bad_state_ex() internal method has been deprecated.
199
200- Standard:
201  . utf8_encode() and utf8_decode() have been deprecated.
202
203========================================
2045. Changed Functions
205========================================
206
207- Core
208  . str*cmp, str*pos, substr_compare functions, using binary safe string
209    comparison now return -1, 0 and 1.
210
211- DBA
212  . dba_open() and dba_popen() now have the following enforced function signature
213    dba_open(string $path, string $mode, ?string $handler = null, int $permission = 0o644, int $map_size = 0, ?int $flags = null)
214  . dba_fetch()'s optional skip argument is now at the end in line with
215    PHP userland semantics its signature now is:
216    dba_fetch(string|array $key, $dba, int $skip = 0): string|false
217    The overloaded signature
218    dba_fetch(string|array $key, $skip, $dba): string|false
219    is still accepted, but it is recommended to use the new standard variant.
220
221- MBString
222  . mb_check_encoding() now checks input encoding more strictly for
223    certain text encodings, including ISO-2022-JP and UTF-7.
224  . mb_detect_encoding() now checks input encoding more strictly
225    when strict detection is enabled.
226  . mb_convert_encoding() checks the input encoding more strictly
227    if multiple encodings are passed to from_encoding
228    and the mbstring.strict_detection INI directive is set to 1.
229    This change only affects the encoding selection,
230    not the result of the conversion.
231
232- Random
233  . random_bytes() and random_int() now throw \Random\RandomException on CSPRNG failure.
234    Previously a plain \Exception was thrown.
235
236- SPL
237  . The $iterator parameter of iterator_to_array() and iterator_count() is
238    widened to iterable from Iterator, allowing arrays to be passed.
239    RFC: https://wiki.php.net/rfc/iterator_xyz_accept_array
240
241- Standard
242  . unserialize() now performs a stricter validation of the structure of serialized
243    objects.
244  . mail() function reverts back to the mixed LF and CRLF new lines (behavior
245    before PHP 8.0) if mail.mixed_lf_and_crlf INI is on.
246  . When $additional_headers of mail() is an array, the same validation as
247    `\r\n` is now applied to `\n` alone too.
248
249- XML
250  . xml_parser_set_option() now actually returns false when attempting to set a
251    negative tag start. Previously it returned true while emitting an E_WARNING.
252
253========================================
2546. New Functions
255========================================
256
257- Curl:
258  . curl_upkeep() (libcurl >= 7.62.0)
259
260- IMAP:
261  . imap_is_open() (Only as of PHP 8.2.1)
262
263- mysqli:
264  . mysqli_execute_query()
265
266- OpenSSL:
267  . openssl_cipher_key_length(): Returns a key length for the supplied
268    cipher.
269
270- Reflection:
271  . ReflectionFunction::isAnonymous()
272  . ReflectionMethod::hasPrototype()
273
274- Sodium:
275  . sodium_crypto_stream_xchacha20_xor_ic()
276
277- Standard:
278  . The peak memory usage can now be reset to the current usage thanks to
279    memory_reset_peak_usage().
280  . ini_parse_quantity(): Parses "shorthand bytes" quantities returned by
281    ini_get(). The function is suitable for parsing quantities whose int value
282    is in the range [PHP_INT_MIN, PHP_INT_MAX].
283    Parsing and interpretation is consistent with ini_set() (see also the
284    "Changes to INI File Handling" section).
285    Caveats: Some ini settings may apply additional constraints to the resuling
286    int value, such as a smaller range, that will not be reflected by
287    ini_parse_quantity(). The `memory_limit` setting accepts values higher than
288    PHP_INT_MAX, than can not be parsed by ini_parse_quantity().
289
290- XML:
291  . libxml_get_external_entity_loader()
292
293========================================
2947. New Classes and Interfaces
295========================================
296
297========================================
2988. Removed Extensions and SAPIs
299========================================
300
301========================================
3029. Other Changes to Extensions
303========================================
304
305- Date:
306  . DatePeriod properties are now properly declared.
307
308- Intl:
309  . IntlBreakIterator, IntlRuleBasedBreakIterator, IntlCodePointBreakIterator,
310    IntlPartsIterator, IntlCalendar, IntlCalendar, Collator, IntlIterator,
311    UConverter, IntlDateFormatter, IntlDatePatternGenerator, MessageFormatter,
312    ResourceBundle, Spoofchecker, IntlTimeZone and Transliterator instances are
313    no longer serializable. Previously, they could be serialized, but
314    unserialization yielded unusable objects or failed.
315
316- mysqli:
317  . The support for libmysql has been removed. It's no longer possible to
318    compile mysqli with libmysql and all relevant functionality has been
319    removed.
320  . The reconnect property of mysqli_driver has been removed. It was supported
321    only by libmysql.
322  . The INI directive mysqli.reconnect has been removed.
323  . The constant MYSQLI_IS_MARIADB has been deprecated.
324
325- OCI8:
326  . The minimum Oracle Client library version required is now 11.2.
327
328- PCRE:
329  . NUL characters (\0) in pattern strings are now supported.
330
331- Session:
332  . Trying to change the SameSite cookie INI setting while the session is
333    active or output has already been sent will now fail and emit a warning.
334    This aligns the behaviour with all other session INI settings.
335
336- SQLite3:
337  . sqlite3.defensive is now PHP_INI_USER.
338
339- Standard:
340  . getimagesize() now reports the actual image dimensions, bits and channels
341    of AVIF images. Previously, the dimensions have been reported as 0x0, and
342    bits and channels have not been reported at all.
343
344- Tidy:
345  . tidy properties are now properly declared.
346  . tidyNode properties are now properly declared as readonly.
347
348- Zip:
349  . extension updated to 1.20.0 with new methods:
350    ZipArchive::clearError, getStreamName and getStreamIndex
351
352========================================
35310. New Global Constants
354========================================
355
356- COM_DOTNET:
357  . DISP_E_PARAMNOTFOUND
358  . LOCALE_NEUTRAL
359
360- Curl:
361  . CURLALTSVC_H1 (libcurl >= 7.64.1)
362  . CURLALTSVC_H2 (libcurl >= 7.64.1)
363  . CURLALTSVC_H3 (libcurl >= 7.64.1)
364  . CURLALTSVC_READONLYFILE (libcurl >= 7.64.1)
365  . CURLAUTH_AWS_SIGV4 (libcurl >= 7.75.0)
366  . CURLE_PROXY (libcurl >= 7.73.0)
367  . CURLFTPMETHOD_DEFAULT
368  . CURLHSTS_ENABLE (libcurl >= 7.74.0)
369  . CURLHSTS_READONLYFILE (libcurl >= 7.74.0)
370  . CURLINFO_PROXY_ERROR (libcurl >= 7.73.0)
371  . CURLINFO_REFERER (libcurl >= 7.76.0)
372  . CURLINFO_RETRY_AFTER (libcurl >= 7.66.0)
373  . CURLMOPT_MAX_CONCURRENT_STREAMS (libcurl >= 7.67.0)
374  . CURLOPT_ALTSVC_CTRL (libcurl >= 7.64.1)
375  . CURLOPT_ALTSVC (libcurl >= 7.64.1)
376  . CURLOPT_AWS_SIGV4 (libcurl >= 7.75.0)
377  . CURLOPT_CAINFO_BLOB (libcurl >= 7.77.0)
378  . CURLOPT_DOH_SSL_VERIFYHOST (libcurl >= 7.76.0)
379  . CURLOPT_DOH_SSL_VERIFYPEER (libcurl >= 7.76.0)
380  . CURLOPT_DOH_SSL_VERIFYSTATUS (libcurl >= 7.76.0)
381  . CURLOPT_HSTS_CTRL (libcurl >= 7.74.0)
382  . CURLOPT_HSTS (libcurl >= 7.74.0)
383  . CURLOPT_MAIL_RCPT_ALLLOWFAILS (libcurl >= 7.69.0)
384  . CURLOPT_MAXAGE_CONN (libcurl >= 7.65.0)
385  . CURLOPT_MAXFILESIZE_LARGE
386  . CURLOPT_MAXLIFETIME_CONN (libcurl >= 7.80.0)
387  . CURLOPT_PROXY_CAINFO_BLOB (libcurl >= 7.77.0)
388  . CURLOPT_SASL_AUTHZID (libcurl >= 7.66.0)
389  . CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256 (libcurl >= 7.80.0)
390  . CURLOPT_SSL_EC_CURVES (libcurl >= 7.73.0)
391  . CURLOPT_UPKEEP_INTERVAL_MS (libcurl >= 7.62.0)
392  . CURLOPT_UPLOAD_BUFFERSIZE (libcurl >= 7.62.0)
393  . CURLOPT_XFERINFOFUNCTION (libcurl >= 7.32.0)
394  . CURLPROTO_MQTT (libcurl >= 7.71.0)
395  . CURLPX_BAD_ADDRESS_TYPE (libcurl >= 7.73.0)
396  . CURLPX_BAD_VERSION (libcurl >= 7.73.0)
397  . CURLPX_CLOSED (libcurl >= 7.73.0)
398  . CURLPX_GSSAPI (libcurl >= 7.73.0)
399  . CURLPX_GSSAPI_PERMSG (libcurl >= 7.73.0)
400  . CURLPX_GSSAPI_PROTECTION (libcurl >= 7.73.0)
401  . CURLPX_IDENTD_DIFFER (libcurl >= 7.73.0)
402  . CURLPX_IDENTD (libcurl >= 7.73.0)
403  . CURLPX_LONG_HOSTNAME (libcurl >= 7.73.0)
404  . CURLPX_LONG_PASSWD (libcurl >= 7.73.0)
405  . CURLPX_LONG_USER (libcurl >= 7.73.0)
406  . CURLPX_NO_AUTH (libcurl >= 7.73.0)
407  . CURLPX_OK (libcurl >= 7.73.0)
408  . CURLPX_RECV_ADDRESS (libcurl >= 7.73.0)
409  . CURLPX_RECV_AUTH (libcurl >= 7.73.0)
410  . CURLPX_RECV_CONNECT (libcurl >= 7.73.0)
411  . CURLPX_RECV_REQACK (libcurl >= 7.73.0)
412  . CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED (libcurl >= 7.73.0)
413  . CURLPX_REPLY_COMMAND_NOT_SUPPORTED (libcurl >= 7.73.0)
414  . CURLPX_REPLY_CONNECTION_REFUSED (libcurl >= 7.73.0)
415  . CURLPX_REPLY_GENERAL_SERVER_FAILURE (libcurl >= 7.73.0)
416  . CURLPX_REPLY_HOST_UNREACHABLE (libcurl >= 7.73.0)
417  . CURLPX_REPLY_NETWORK_UNREACHABLE (libcurl >= 7.73.0)
418  . CURLPX_REPLY_NOT_ALLOWED (libcurl >= 7.73.0)
419  . CURLPX_REPLY_TTL_EXPIRED (libcurl >= 7.73.0)
420  . CURLPX_REPLY_UNASSIGNED (libcurl >= 7.73.0)
421  . CURLPX_REQUEST_FAILED (libcurl >= 7.73.0)
422  . CURLPX_RESOLVE_HOST (libcurl >= 7.73.0)
423  . CURLPX_SEND_AUTH (libcurl >= 7.73.0)
424  . CURLPX_SEND_CONNECT (libcurl >= 7.73.0)
425  . CURLPX_SEND_REQUEST (libcurl >= 7.73.0)
426  . CURLPX_UNKNOWN_FAIL (libcurl >= 7.73.0)
427  . CURLPX_UNKNOWN_MODE (libcurl >= 7.73.0)
428  . CURLPX_USER_REJECTED (libcurl >= 7.73.0)
429  . CURLSSLOPT_AUTO_CLIENT_CERT (libcurl >= 7.77.0)
430  . CURLSSLOPT_NATIVE_CA (libcurl >= 7.71.0)
431  . CURLSSLOPT_NO_PARTIALCHAIN (libcurl >= 7.68.0)
432  . CURLSSLOPT_REVOKE_BEST_EFFORT (libcurl >= 7.70.0)
433  . CURL_VERSION_GSASL (libcurl >= 7.76.0)
434  . CURL_VERSION_HSTS (libcurl >= 7.74.0)
435  . CURL_VERSION_HTTP3 (libcurl >= 7.66.0)
436  . CURL_VERSION_UNICODE (libcurl >= 7.72.0)
437  . CURL_VERSION_ZSTD (libcurl >= 7.72.0)
438
439- DBA
440  . DBA_LMDB_USE_SUB_DIR
441  . DBA_LMDB_NO_SUB_DIR
442
443- Filter
444  . FILTER_FLAG_GLOBAL_RANGE
445
446- Sockets:
447  . SO_INCOMING_CPU
448  . SO_MEMINFO
449  . SO_RTABLE (OpenBSD)
450  . TCP_KEEPALIVE (MacOS)
451  . TCP_KEEPCNT (Linux, others)
452  . TCP_KEEPIDLE (Linux, others)
453  . TCP_KEEPINTVL (Linux, others)
454  . TCP_NOTSENT_LOWAT
455  . LOCAL_CREDS_PERSISTENT (FreeBSD)
456  . SCM_CREDS2 (FreeBSD)
457  . LOCAL_CREDS (NetBSD)
458  . SO_BPF_EXTENSIONS
459  . SO_SETFIB
460  . TCP_CONGESTION (Linux, FreeBSD)
461  . SO_ZEROCOPY (Linux)
462  . MSG_ZEROCOPY (Linux)
463
464========================================
46511. Changes to INI File Handling
466========================================
467
468- Support for binary and octal number prefixes for INI settings has been added.
469  Previously only hexadecimal prefixes and using a leading 0 for octal numbers
470  was supported.
471
472- Parsing of some ill-formatted values will now trigger a warning when this was
473  silently ignored before. Interpretation of these values is not changed, for
474  backwards compatibility. This affects the following settings:
475  . bcmath.scale
476  . com.code_page
477  . default_socket_timeout
478  . fiber.stack_size
479  . hard_timeout
480  . intl.error_level
481  . ldap.max_links
482  . max_input_nesting_level
483  . max_input_vars
484  . mbstring.regex_retry_limit
485  . mbstring.regex_stack_limit
486  . mysqli.allow_local_infile
487  . mysqli.allow_persistent
488  . mysqli.default_port
489  . mysqli.max_links
490  . mysqli.max_persistent
491  . mysqli.reconnect
492  . mysqli.rollback_on_cached_plink
493  . mysqlnd.log_mask
494  . mysqlnd.mempool_default_size
495  . mysqlnd.net_read_buffer_size
496  . mysqlnd.net_read_timeout
497  . oci8.default_prefetch
498  . oci8.max_persistent
499  . oci8.persistent_timeout
500  . oci8.ping_interval
501  . oci8.prefetch_lob_size
502  . oci8.privileged_connect
503  . oci8.statement_cache_size
504  . odbc.allow_persistent
505  . odbc.check_persistent
506  . odbc.defaultbinmode
507  . odbc.default_cursortype
508  . odbc.defaultlrl
509  . odbc.max_links
510  . odbc.max_persistent
511  . opcache.consistency_checks
512  . opcache.file_update_protection
513  . opcache.force_restart_timeout
514  . opcache.interned_strings_buffer
515  . opcache.jit_bisect_limit
516  . opcache.jit_blacklist_root_trace
517  . opcache.jit_blacklist_side_trace
518  . opcache.jit_debug
519  . opcache.jit_hot_func
520  . opcache.jit_hot_loop
521  . opcache.jit_hot_return
522  . opcache.jit_hot_side_exit
523  . opcache.jit_max_exit_counters
524  . opcache.jit_max_loop_unrolls
525  . opcache.jit_max_polymorphic_calls
526  . opcache.jit_max_recursive_calls
527  . opcache.jit_max_recursive_returns
528  . opcache.jit_max_root_traces
529  . opcache.jit_max_side_traces
530  . opcache.log_verbosity_level
531  . opcache.max_file_size
532  . opcache.opt_debug_level
533  . opcache.optimization_level
534  . opcache.revalidate_freq
535  . output_buffering
536  . pcre.backtrack_limit
537  . pcre.recursion_limit
538  . pgsql.max_links
539  . pgsql.max_persistent
540  . post_max_size
541  . realpath_cache_size
542  . realpath_cache_ttl
543  . session.cache_expire
544  . session.cookie_lifetime
545  . session.gc_divisor
546  . session.gc_maxlifetime
547  . session.gc_probability
548  . soap.wsdl_cache_limit
549  . soap.wsdl_cache_ttl
550  . unserialize_max_depth
551  . upload_max_filesize
552  . user_ini.cache_ttl
553  . xmlrpc_error_number
554  . zend.assertions
555  . zlib.output_compression_level
556
557========================================
55812. Windows Support
559========================================
560
561- Core:
562  . Windows specific error messages are no longer localized, but instead in
563    English to better match PHP error messages.
564  . Preliminary and highly experimental support for building on ARM64 has been
565    added.
566
567- OCI8:
568  . Since building against Oracle Client 10g is no longer supported anyway,
569    the configuration option --with-oci8 has been dropped. --with-oci8-11g,
570    --with-oci8-12c and --with-oci8-19 are still supported.
571
572- Zip:
573  . The Zip extension upgraded to version 1.21.0
574  . The Zip extension is now built as shared library (DLL) by default.
575
576========================================
57713. Other Changes
578========================================
579
580- CLI:
581  . The STDOUT, STDERR and STDIN are no longer closed on resource destruction
582    which is mostly when the CLI finishes. It is however still possible to
583    explicitly close those streams using fclose and similar.
584
585- Core:
586  . The iterable type is now a built-in compile time alias for array|Traversable.
587    Error messages relating to iterable will therefore now use array|Traversable.
588    Type Reflection is preserved for single iterable (and ?iterable) to produce
589    a ReflectionNamedType with name iterable, however usage of iterable in
590    union types will be converted to array|Traversable
591
592========================================
59314. Performance Improvements
594========================================
595