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