xref: /php-src/UPGRADING (revision 77fa4c0f)
1PHP 8.4 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- CLI:
23  . The builtin server looks for an index file recursively by traversing parent
24    directories in case the specified file cannot be located. This process was
25    previously skipped if the path looked like it was referring to a file, i.e.
26    if the last path component contained a period. In that case, a 404 error was
27    returned. The behavior has been changed to look for an index file in all
28    cases.
29
30- Core:
31  . The type of PHP_DEBUG and PHP_ZTS constants changed to bool.
32
33- DOM:
34  . Added DOMNode::compareDocumentPosition() and DOMNode::DOCUMENT_POSITION_*
35    constants.
36    If you have a method or constant with the same name, you might encounter errors
37    if the declaration is incompatible.
38  . Some DOM methods previously returned false or a PHP_ERR DOMException if a new
39    node could not be allocated. They consistently throw an INVALID_STATE_ERR
40    DOMException now. This situation is extremely unlikely though and probably
41    will not affect you. As a result DOMImplementation::createDocument() now has
42    a tentative return type of DOMDocument instead of DOMDocument|false.
43  . Previously, DOMXPath objects could be cloned, but resulted in an unusable
44    object. This is no longer possible, and cloning a DOMXPath object now throws
45    an error.
46
47- Intl:
48  . resourcebundle_get(), ResourceBundle::get(), and accessing offsets on a
49    ResourceBundle object now throw:
50    - TypeError for invalid offset types
51    - ValueError for an empty string
52    - ValueError if the integer index does not fit in a signed 32 bit integer
53
54- MBString:
55  . mb_encode_numericentity() and mb_decode_numericentity() now check that
56    the $map is only composed of integers, if not a ValueError is thrown.
57  . mb_http_input() now always throws a ValueError if the $type is invalid.
58  . mb_http_output() now checks that the $encoding parameter does not
59    contain any null bytes. If it does, a ValueError is now thrown.
60  . On invalid strings (those with encoding errors), mb_substr() now interprets
61    character indices in the same manner as most other mbstring functions. This
62    means that character indices returned by mb_strpos() can be passed to mb_substr().
63  . For SJIS-Mac (MacJapanese) strings, character indices passed to mb_substr() now
64    refer to the indices of the Unicode codepoints which are produced when the string
65    is converted to Unicode. This is significant because around 40 SJIS-Mac characters
66    convert to a sequence of multiple Unicode codepoints.
67
68- ODBC:
69  . odbc_fetch_row() returns false when a value less than or equal to 0 is
70    passed for parameter $row. Now, a warning is emitted in this case.
71  . odbc_connect() and odbc_pconnect() will now return an Odbc\Connection
72    object rather than a resource. Return value checks using is_resource()
73    should be replaced with checks for `false`.
74  . odbc_prepare(), odbc_exec(), and various other functions will now return
75    an Odbc\Result object rather than a resource. Return value checks using
76    is_resource() should be replaced with checks for `false`.
77
78- Opcache:
79  . The JIT config defaults changed from opcache.jit=tracing and
80    opcache.jit_buffer_size=0 to opcache.jit=disable and
81    opcache.jit_buffer_size=64M, respectively. This does not affect the default
82    behavior, the JIT is still disabled by default. However, it is now disabled
83    through the opcache.jit setting, rather than opcache.jit_buffer_size. This
84    may affect users who previously enabled JIT through opcache.jit_buffer_size
85    exclusively, without also specifying a JIT mode using opcache.jit. To enable
86    JIT, set the opcache.jit config value accordingly.
87  . The maximum value of the opcache.interned_strings_buffer setting on 64bit
88    architectures is now 32767 (it was previously 4095).
89
90- PCRE:
91  . The bundled pcre2lib has been updated to version 10.43.
92    As a consequence, this means {,3} is now recognized as a quantifier instead
93    of as text. Furthermore, the meaning of some character classes in UCP mode
94    has changed. Consult https://github.com/PCRE2Project/pcre2/blob/master/NEWS
95    for a full changelog.
96
97- PDO_DBLIB:
98  . setAttribute, DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER and DBLIB_ATTR_DATETIME_CONVERT
99    have been changed to set value as a bool.
100
101- PDO_FIREBIRD:
102  . getAttribute, ATTR_AUTOCOMMIT has been changed to get the value as a bool.
103
104- PDO_MYSQL:
105  . getAttribute, ATTR_AUTOCOMMIT, ATTR_EMULATE_PREPARES, MYSQL_ATTR_DIRECT_QUERY have
106    been changed to get values as bool.
107
108- PDO_PGSQL:
109  . The DSN's credentials, when set, are given priority over their PDO
110    constructor counterparts, being closer to the documentation states.
111
112- PCNTL:
113  . The functions pcntl_sigprocmask(), pcntl_sigwaitinfo() and
114    pcntl_sigtimedwait() now throw:
115    - A ValueError if the $signals array is empty (except for
116      pcntl_sigprocmask() if the $mode is SIG_SETMASK).
117    - A TypeError if a value of the $signals array is not an integer
118    - A ValueError if a value of the $signals array is not a valid signal number
119    Moreover, those functions now always return false on failure.
120    In some case previously it could return the value -1.
121  . The function pcntl_sigprocmask() will also now throw:
122    - A ValueError if $mode is not one of SIG_BLOCK, SIG_UNBLOCK, or SIG_SETMASK
123  . The function pcntl_sigtimedwait() will also now throw:
124    - A ValueError if $seconds is less than 0
125    - A ValueError if $nanoseconds is less than 0 or greater than 1e9
126    - A ValueError if both $seconds and $nanoseconds are 0
127
128- SimpleXML:
129  . Get methods called, or casting to a string on a SimpleXMLElement will no
130    longer implicitly reset the iterator data, unless explicitly rewound.
131    For example, casting an element to a string within a foreach loop would
132    cause an infinite loop because it destroyed the current iterator data.
133    This is no longer the case as a consequence of the bugfixes for GH-12192,
134    GH-12208, #55098.
135  . Calling simplexml_import_dom() with a non-XML object now throws a TypeError
136    instead of a ValueError.
137
138- SOAP:
139  . SoapClient::$httpurl is now a Soap\Url object rather than a resource.
140    Checks using is_resource() (i.e. is_resource($client->httpurl)) should be
141    replaced with checks for null (i.e. $client->httpurl !== null).
142  . SoapClient::$sdl is now a Soap\Sdl object rather than a resource.
143    Checks using is_resource() (i.e. is_resource($client->sdl)) should be
144    replaced with checks for null (i.e. $client->sdl !== null).
145  . SoapClient::$typemap is now an array rather than a resource.
146    Checks using is_resource() (i.e. is_resource($client->typemap)) should be
147    replaced with checks for null (i.e. $client->typemap !== null).
148
149- SPL:
150  . Out of bounds accesses in SplFixedArray now throw an exception of type
151    OutOfBoundsException instead of RuntimeException. As OutOfBoundsException
152    is a child class of RuntimeException, code that uses RuntimeException
153    continues to function.
154
155- Standard:
156  . round() now validates the value of the $mode parameter and throws a ValueError
157    for invalid modes. Previously invalid modes would have been interpreted as
158    PHP_ROUND_HALF_UP.
159  . strcspn() with empty $characters now returns the length of the string instead
160    of incorrectly stopping at the first NUL character. See GH-12592.
161
162- XML:
163  . The xml_set_*_handler() functions now declare and check for an effective
164    signature of callable|string|null for the $handler parameters.
165    Moreover, values of type string that correspond to method names,
166    of object set with xml_set_object() are now checked to see if the method
167    exists on the class of the previously passed object.
168    This means that xml_set_object() must now always be called prior to setting
169    method names as callables.
170    Passing an empty string to disable the handler is still allowed,
171    but not recommended.
172
173- XSL:
174  . XSLTProcessor::setParameter() will now throw a ValueError when its arguments
175    contain null bytes. This never actually worked correctly in the first place,
176    which is why it throws an exception nowadays.
177  . Failure to call a PHP function callback during evaluation now throws
178    instead of emitting a warning.
179    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
180  . Calling XSLTProcessor::importStyleSheet() with a non-XML object now throws
181    a TypeError instead of a ValueError.
182
183========================================
1842. New Features
185========================================
186
187- Core:
188  . Added request_parse_body() function that allows parsing RFC1867 (multipart)
189    requests in non-POST HTTP requests.
190    RFC: https://wiki.php.net/rfc/rfc1867-non-post
191  . Getting the debug info for WeakReference will now also output the object
192    it references, or null if the reference is no longer valid.
193  . The output of Closure::__debugInfo() now includes the name, file, and line
194    of the Closure.
195
196- Curl:
197  . curl_version() returns an additional feature_list value, which is an
198    associative array of all known Curl features, and whether they are
199    supported (true) or not (false).
200
201- Date:
202  . Added static methods
203    DateTime[Immutable]::createFromTimestamp(int|float $timestamp): static.
204  . Added method DateTime[Immutable]::getMicrosecond(): int.
205  . Added method
206    DateTime[Immutable]::setMicrosecond(int $microsecond): static.
207
208- DOM:
209  . Added constant DOMNode::DOCUMENT_POSITION_DISCONNECTED.
210  . Added constant DOMNode::DOCUMENT_POSITION_PRECEDING.
211  . Added constant DOMNode::DOCUMENT_POSITION_FOLLOWING.
212  . Added constant DOMNode::DOCUMENT_POSITION_CONTAINS.
213  . Added constant DOMNode::DOCUMENT_POSITION_CONTAINED_BY.
214  . Added constant DOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC.
215  . It is now possible to pass any callable to registerPhpFunctions().
216    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
217
218- FPM:
219  . Flushing headers without a body will now succeed. See GH-12785.
220
221- Intl:
222  . NumberFormatter::ROUND_HALFODD added to complement existing
223    NumberFormatter::ROUND_HALFEVEN functionality.
224
225- Phar:
226  . Added support for the unix timestamp extension for zip archives.
227
228- PCRE:
229  . The bundled pcre2lib has been updated to version 10.43.
230    As a consequence, LoongArch JIT support has been added, spaces
231    are now allowed between braces in Perl-compatible items, and
232    variable-length lookbehind assertions are now supported.
233  . Added support for the "r" (PCRE2_EXTRA_CASELESS_RESTRICT) modifier, as well
234    as the (?r) mode modifier. When enabled along with the case-insensitive
235    modifier ("i"), the expression locks out mixing of ASCII and non-ASCII
236    characters.
237
238- PDO:
239  . Added support for driver-specific subclasses.
240    RFC: https://wiki.php.net/rfc/pdo_driver_specific_subclasses
241    This RFC adds subclasses for PDO in order to better support
242    database-specific functionalities. The new classes are
243    instantiatable either via calling the PDO::connect() method
244    or by invoking their constructor directly.
245
246- PDO_DBLIB:
247  . Added class PdoDbLib.
248
249- PDO_FIREBIRD:
250  . Added class PdoFirebird.
251
252- PDO_MYSQL:
253  . Added class PdoMysql.
254
255- PDO_ODBC:
256  . Added class PdoOdbc.
257
258- PDO_PGSQL:
259  . Added class PdoPgsql.
260
261- PDO_SQLITE:
262  . Added class PdoSqlite.
263
264- POSIX:
265  . Added constant POSIX_SC_CHILD_MAX
266  . Added constant POSIX_SC_CLK_TCK
267
268- Readfile:
269  . Added ability to change .php_history path through PHP_HISTFILE env variable.
270
271- Reflection:
272  . ReflectionAttribute now contains a $name property to improve the debugging
273    experience.
274  . ReflectionClassConstant::__toString() and ReflectionProperty::__toString()
275    now returns the attached doc comments.
276  . ReflectionConstant was introduced.
277  . ReflectionClassConstant::isDeprecated() was introduced.
278
279- Standard:
280  . stream_bucket_make_writeable() and stream_bucket_new() will now return a
281    StreamBucket instance instead of an stdClass instance.
282    RFC: https://wiki.php.net/rfc/dedicated_stream_bucket
283
284- SOAP:
285  . Added support for clark notation for namespaces in class map.
286    It is now possible to specify entries in a class map with clark notation
287    to resolve a type with a specific namespace to a specific class.
288    For example: '{http://example.com}foo' => 'FooClass'.
289  . Instances of DateTimeInterface that are passed to xsd:datetime or similar
290    elements are now serialized as such instead of being serialized as an
291    empty string.
292
293- XSL:
294  . It is now possible to use parameters that contain both single and double
295    quotes.
296  . It is now possible to pass any callable to registerPhpFunctions().
297    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
298  . Added XSLTProcessor::$maxTemplateDepth and XSLTProcessor::$maxTemplateVars
299    to control the recursion depth of XSL template evaluation.
300
301========================================
3023. Changes in SAPI modules
303========================================
304
305========================================
3064. Deprecated Functionality
307========================================
308
309- Core:
310  . Implicitly nullable parameter types are now deprecated.
311    RFC: https://wiki.php.net/rfc/deprecate-implicitly-nullable-types
312
313- Curl:
314  . The CURLOPT_BINARYTRANSFER constant is deprecated.
315
316- Date:
317  . Calling DatePeriod::__construct(string $isostr, int $options = 0) is
318    deprecated. Use DatePeriod::createFromISO8601String() instead.
319
320- Intl:
321  . Calling intlcal_set() as well as calling IntlCalendar::set() with
322    more than 2 arguments is deprecated. Use either IntlCalendar::setDate()
323    or IntlCalendar::setDateTime() instead.
324  . Calling intlgregcal_create_instance() as well as calling
325    IntlGregorianCalendar::__construct() with more than 2 arguments is
326    deprecated. Use either IntlGregorianCalendar::createFromDate() or
327    IntlGregorianCalendar::createFromDateTime() instead.
328
329- LDAP:
330  . Calling ldap_connect() with more than 2 arguments is deprecated. Use
331    ldap_connect_wallet() instead.
332  . Calling ldap_exop() with more than 4 arguments is deprecated. Use
333    ldap_exop_sync() instead.
334
335- PgSQL:
336  . Calling pgsql_fetch_result() with 2 arguments is deprecated. Use the
337    3-parameter signature with a null $row parameter instead.
338  . Calling pg_field_prtlen() with 2 arguments is deprecated. Use the
339    3-parameter signature with a null $row parameter instead.
340  . Calling pg_field_is_null() with 2 arguments is deprecated. Use the
341    3-parameter signature with a null $row parameter instead.
342  . Added pg_result_memory_size to get the visibility the memory used by a query result.
343
344- Reflection:
345  . Calling ReflectionMethod::__construct() with 1 argument is deprecated.
346    Use ReflectionMethod::createFromMethodName() instead.
347
348- Session:
349  . Calling session_set_save_handler() with more than 2 arguments is
350    deprecated. Use the 2-parameter signature instead.
351
352- Standard:
353  . Calling stream_context_set_option() with 2 arguments is deprecated.
354    Use stream_context_set_options() instead.
355
356========================================
3575. Changed Functions
358========================================
359
360- Core:
361  . trigger_error() and user_error() now have a return type of true instead of
362    bool.
363
364- DOM:
365  . DOMDocument::registerNodeClass() now has a tentative return type of true.
366    Previously, the return type was bool but only true could be returned in practice.
367
368- Gettext:
369  . bind_textdomain_codeset, textdomain and d(*)gettext functions now throw an exception
370    if the domain argument is empty.
371
372- Hash:
373  . Changed the return type of hash_update() to true. It was already the case that only
374    true could be returned, but the stub was not updated yet.
375
376- Intl:
377  . IntlDateFormatter::__construct() throws a ValueError if the locale is invalid.
378  . NumberFormatter::__construct() throws a ValueError if the locale is invalid.
379  . NumberFormatter::ROUND_TOWARD_ZERO and NumberFormatter::ROUND_AWAY_FROM_ZERO
380    have been added as aliases for NumberFormatter::ROUND_DOWN and
381    NumberFormatter::ROUND_UP to be consistent with the new PHP_ROUND_* modes.
382    RFC: https://wiki.php.net/rfc/new_rounding_modes_to_round_function
383  . ResourceBundle::get() now has a tentative return type of:
384    ResourceBundle|array|string|int|null
385
386- MBString:
387  . The behavior of mb_strcut is more consistent now on invalid UTF-8 and UTF-16
388    strings. (For valid UTF-8 and UTF-16 strings, there is no change.)
389
390- OpenSSL:
391  . The extra_attributes parameter in openssl_csr_new sets CSR attributes
392    instead of subject DN which was incorrectly done previously.
393  . The dn parameter in openssl_csr_new allows setting array of values for
394    a single entry.
395  . New serial_hex parameter added to openssl_csr_sign to allow setting serial
396    number in the hexadecimal format.
397
398- ODBC:
399  . Parameter $row of odbc_fetch_object(), odbc_fetch_array(), and
400    odbc_fetch_into() now has a default value of null, consistent with
401    odbc_fetch_row(). Previously, the default values were -1, -1, and 0,
402    respectively.
403
404- Output:
405  . Output handler status flags passed to the flags parameter of ob_start
406    are now cleared.
407
408- PDO:
409  . getAttribute, enabled to get the value of ATTR_STRINGIFY_FETCHES.
410
411- PDO_FIREBIRD:
412  . getAttribute, enabled to get values of FB_ATTR_DATE_FORMAT, FB_ATTR_TIME_FORMAT,
413    FB_ATTR_TIMESTAMP_FORMAT.
414  . Added new attributes to specify transaction isolation level and access mode.
415    Along with these, five constants (PDO::FB_TRANSACTION_ISOLATION_LEVEL,
416    PDO::FB_READ_COMMITTED, PDO::FB_REPEATABLE_READ, PDO::FB_SERIALIZABLE,
417    PDO::FB_WRITABLE_TRANSACTION) have been added.
418  . When using persistent connections, there is now a liveness check in the
419    constructor.
420
421- PDO_MYSQL:
422  . getAttribute, enabled to get the value of ATTR_FETCH_TABLE_NAMES.
423
424- PGSQL:
425  . pg_select, the conditions arguments accepts an empty array and is optional.
426
427- POSIX:
428  . posix_isatty now sets the error number when the file descriptor/stream argument
429    is invalid.
430
431- Sockets:
432  . Parameter $backlog of socket_create_listen() now has a default value of SOMAXCONN.
433    Previously, it was 128.
434
435- SPL:
436  . SplPriorityQueue::insert() and SplPriorityQueue::recoverFromCorruption()
437    now has a tentative return type of true
438  . SplHeap::insert() and SplHeap::recoverFromCorruption()
439    now has a tentative return type of true instead of bool
440
441- Standard:
442  . The internal implementation for rounding to integers has been rewritten
443    to be easier to verify for correctness and to be easier to maintain.
444    Some rounding bugs have been fixed as a result of the rewrite. For
445    example previously rounding 0.49999999999999994 to the nearest integer
446    would have resulted in 1.0 instead of the correct result 0.0. Additional
447    inputs might also be affected and result in different outputs compared to
448    earlier PHP versions.
449  . The default value of the 'cost' option for PASSWORD_BCRYPT for password_hash()
450    has been increased from '10' to '12'.
451
452    RFC: https://wiki.php.net/rfc/bcrypt_cost_2023
453  . Four new modes have been added to the round() function: PHP_ROUND_CEILING,
454    PHP_ROUND_FLOOR, PHP_ROUND_TOWARD_ZERO, PHP_ROUND_AWAY_FROM_ZERO.
455
456    RFC: https://wiki.php.net/rfc/new_rounding_modes_to_round_function
457  . debug_zval_dump() now indicates whether an array is packed.
458  . Fixed a bug caused by "pre-rounding" of the round() function. Previously, using
459    "pre-rounding" to treat a value like 0.285 (actually 0.28499999999999998) as a
460    decimal number and round it to 0.29. However, "pre-rounding" incorrectly rounds
461    certain numbers, so this fix removes "pre-rounding" and changes the way numbers
462    are compared, so that the values are correctly rounded as decimal numbers.
463  . long2ip() now returns string instead of string|false.
464  . The maximum precision that can be handled by round() has been extended by
465    one digit.
466  . output_add_rewrite_var() now uses url_rewriter.hosts instead of
467    session.trans_sid_hosts for selecting hosts that will be rewritten.
468
469========================================
4706. New Functions
471========================================
472
473- BCMath:
474  . Added bcfloor(), bcceil(), bcround().
475    RFC: https://wiki.php.net/rfc/adding_bcround_bcfloor_bcceil_to_bcmath
476
477- DOM:
478  . Added DOMNode::compareDocumentPosition().
479  . Added DOMXPath::registerPhpFunctionNS().
480    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
481  . Added DOMXPath::quote() to quote a string for use in an XPath expression.
482    Example usage: "//span[contains(text()," . $xpath->quote($string) . ")]"
483
484- Intl:
485  . Added IntlDateFormatter::getIanaID()/intltz_get_iana_id() to
486    the IANA identifier from a given timezone.
487  . Added grapheme_str_split which allow to support emoji and Variation
488    Selectors.
489  . Added IntlDateFormatter::parseToCalendar which behaves like
490    IntlDateFormatter::parse except the time zone is updated.
491
492- MBString:
493  . Added mb_trim, mb_ltrim and mb_rtrim functions.
494    RFC: https://wiki.php.net/rfc/mb_trim
495    Note: this was amended by GH-13820 to fix GH-13815.
496  . Added mb_ucfirst and mb_lcfirst functions.
497    RFC: https://wiki.php.net/rfc/mb_ucfirst
498
499- Opcache:
500  . If JIT is enabled, PHP will now exit with a fatal error on startup in case
501    of JIT startup initialization issues.
502
503- PCNTL:
504  . Added pcntl_setns allowing a process to be reassociated with a namespace in order
505    to share resources with other processes within this context.
506  . Added pcntl_getaffinity to get the cpu(s) bound to a process and
507    pcntl_setaffinity to bind 1 or more cpus to a process.
508  . Added pcntl_getcpu to get the cpu id from where the current process runs.
509  . Added pcntl_getqos_class to get the QoS level (aka performance and related
510    energy consumption) of the current process and pcntl_setqos_class to set it.
511
512- Sodium:
513  . Added the sodium_crypto_aead_aegis128l_*() and sodium_crypto_aead_aegis256l_*()
514    functions to support the AEGIS family of authenticated encryption algorithms,
515    that was introduced in libsodium 1.0.19.
516  . sodium_crypto_aead_aes256gcm_*() functions are now enabled on aarch64 CPUs
517    with the ARM cryptographic extensions.
518
519- SPL:
520  . Added seek() method to SplObjectStorage, now it implements
521    SeekableIterator.
522
523- Standard:
524  . Added the http_get_last_response_headers() and
525    http_clear_last_response_headers() that allows retrieving the same content
526    as the magic $http_response_header variable.
527
528- XSL:
529  . Added XSLTProcessor::registerPhpFunctionNS().
530    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
531
532========================================
5337. New Classes and Interfaces
534========================================
535
536- DOM:
537  . Implemented DOM HTML5 parsing and serialization.
538    RFC: https://wiki.php.net/rfc/domdocument_html5_parser.
539    This RFC adds the new Dom namespace along with new classes and
540    constant aliases.
541    There are two new classes to handle HTML and XML documents:
542    Dom\HTMLDocument and Dom\XMLDocument.
543    These classes provide a cleaner API to handle HTML and XML documents.
544    Furthermore, the Dom\HTMLDocument class implements spec-compliant HTML5
545    parsing and serialization.
546  . Implemented opt-in ext/dom spec compliance RFC.
547    This adds new classes in the DOM namespace that correspond to modern
548    equivalents to the old DOM classes in the global namespaces.
549    The new classes follow the DOM living spec.
550    RFC: https://wiki.php.net/rfc/opt_in_dom_spec_compliance
551
552========================================
5538. Removed Extensions and SAPIs
554========================================
555
556- IMAP:
557  . The IMAP extension has been unbundled and moved to PECL.
558    RFC: https://wiki.php.net/rfc/unbundle_imap_pspell_oci8
559
560- PSpell:
561  . The pspell extension has been unbundled and moved to PECL.
562    RFC: https://wiki.php.net/rfc/unbundle_imap_pspell_oci8
563
564========================================
5659. Other Changes to Extensions
566========================================
567
568- Curl:
569  . The Curl extension now requires at least libcurl 7.61.0.
570
571- Intl:
572  . The class constants are typed now.
573
574- Intl:
575  . The OpenSSL extension now requires at least OpenSSL 1.1.1.
576
577- PDO:
578  . The class constants are typed now.
579
580- Reflection:
581  . The class constants are typed now.
582
583- Spl:
584  . The class constants are typed now.
585
586- Sqlite:
587  . The class constants are typed now.
588
589- XMLReader:
590  . The class constants are typed now.
591
592- XSL:
593  . The typed properties XSLTProcessor::$cloneDocument and
594    XSLTProcessor::$doXInclude are now declared.
595
596========================================
59710. New Global Constants
598========================================
599
600- Core:
601  . PHP_OUTPUT_HANDLER_PROCESSED.
602
603- Intl:
604  . The IntlDateFormatter class exposes now the new PATTERN constant
605    reflecting udat api's UDAT_PATTERN.
606  . The IntlChar class exposes now the new PROPERTY_IDS_UNARY_OPERATOR (new
607    IDS binary operator), PROPERTY_ID_COMPAT_MATH_START,
608    PROPERTY_ID_COMPAT_MATH_CONTINUE (both for mathematical
609    identifier profiling purpose) constants.
610
611- LDAP:
612  . LDAP_OPT_X_TLS_PROTOCOL_MAX.
613  . LDAP_OPT_X_TLS_PROTOCOL_TLS1_3.
614
615- LibXML:
616  . LIBXML_RECOVER.
617
618- OpenSSL:
619  . X509_PURPOSE_OCSP_HELPER.
620  . X509_PURPOSE_TIMESTAMP_SIGN.
621
622- PCNTL:
623  . QosClass::Background (macOs only).
624  . QosClass::Default (macOs only).
625  . QosClass::UserInteractive (macOs only).
626  . QosClass::UserInitiated (macOs only).
627  . QosClass::Utility (macOs only).
628  . SIGCKPT (DragonFlyBSD only).
629  . SIGCKPTEXIT (DragonFlyBSD only).
630
631- Standard:
632  . PHP_ROUND_CEILING.
633  . PHP_ROUND_FLOOR.
634  . PHP_ROUND_TOWARD_ZERO.
635  . PHP_ROUND_AWAY_FROM_ZERO.
636
637- Sockets:
638  . SO_EXCLUSIVEADDRUSE (Windows only).
639  . SOCK_CONN_DGRAM (NetBSD only).
640  . SOCK_DCCP (NetBSD only).
641  . TCP_SYNCNT (Linux only).
642  . SO_EXCLBIND (Solaris/Illumos only).
643  . SO_NOSIGPIPE (macOs and FreeBSD).
644
645- Sodium:
646  . SODIUM_CRYPTO_AEAD_AEGIS128L_KEYBYTES
647  . SODIUM_CRYPTO_AEAD_AEGIS128L_NSECBYTES
648  . SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES
649  . SODIUM_CRYPTO_AEAD_AEGIS128L_ABYTES
650  . SODIUM_CRYPTO_AEAD_AEGIS256_KEYBYTES
651  . SODIUM_CRYPTO_AEAD_AEGIS256_NSECBYTES
652  . SODIUM_CRYPTO_AEAD_AEGIS256_NPUBBYTES
653  . SODIUM_CRYPTO_AEAD_AEGIS256_ABYTES
654
655- XML:
656  . Added XML_OPTION_PARSE_HUGE to allow large inputs in xml_parse and
657    xml_parse_into_struct.
658    RFC: https://wiki.php.net/rfc/xml_option_parse_huge.
659
660========================================
66111. Changes to INI File Handling
662========================================
663
664========================================
66512. Windows Support
666========================================
667
668========================================
66913. Other Changes
670========================================
671
672* Closure names have been adjusted to include the parent function's name
673  and the line of definition to make them easier to distinguish, for example
674  within stack traces.
675
676* run-tests.php now skips online tests by default. Set the SKIP_ONLINE_TESTS
677  environment variable to 0, or pass the --online flag to run-tests.php to
678  execute them.
679
680========================================
68114. Performance Improvements
682========================================
683
684- BCMath:
685  . Improved performance of number conversions and operations.
686
687- Core:
688  . Improved the performance of floating point number parsing and formatting in
689    ZTS builds under highly concurrent loads. This affects the `printf()` family
690    of functions as well as serialization functions such as `json_encode()`,
691    `serialize()`.
692
693- DOM:
694  . The performance of DOMNode::C14N() is greatly improved for the case without
695    an xpath query. This can give a time improvement of easily two order of
696    magnitude for documents with tens of thousands of nodes.
697  . Improved performance and reduce memory consumption of XML serialization.
698
699- FTP:
700  . Improved the performance of FTP uploads up to a factor of 10x for large
701    uploads.
702
703- MBString:
704  . The performance of strspn() and strcspn() is greatly improved.
705    They now run in linear time instead of being bounded by quadratic time.
706  . mb_strcut() is much faster now for UTF-8 and UTF-16 strings.
707  . Looking up mbstring encoding names is much faster now.
708  . The performance of converting SJIS-win to unicode is greatly improved.
709
710- MySQLnd:
711  . Improved the performance of MySQLnd quoting.
712
713- SimpleXML:
714  . Improved performance and reduce memory consumption of XML serialization.
715
716- Standard:
717  . Improved the performance of strpbrk().
718  . get_browser() is much faster now, up to 1.5x - 2.5x for some test cases.
719
720