There have been numerous updates and enhancements to the PHP core over the past month, from thought-provoking RFCs to minor yet profound adjustments. Let's dive in and keep up with the most recent PHP developments.
The PHP Foundation is a collective of PHP contributors, veterans, and companies that collaborate to ensure the long-term sustainability of the PHP programming language. The foundation currently supports six contributors focused on PHP's maintenance, debt reduction, and feature development. These contributors work closely with others on coding, documentation, and discussions.
Started over a year ago, the PHP Core Roundup series offers a summary of the latest developments, discussions, and news about PHP Core, contributed by both PHP Foundation members and other participants. This post is the thirteenth in the PHP Core Roundup series.
Happy 28th birthday, PHP!
On June 8, PHP turned 28 years old! For a throwback, see Rasmus Lerdorf’s initial public announcement of PHP.
Here’s to many more years of empowering developers and pushing the boundaries of web technology. Happy Birthday, PHP! 🎉🥳🎂
PHP 8.3.0 QA Releases and Feature-freeze
The upcoming PHP 8.3 version is scheduled to be released on November 23. The newly elected PHP 8.3 release managers made the first QA releases of PHP 8.3 — PHP 8.3.0 Alpha 1 — on June 08, and the second alpha release on June 22.
These alpha versions aren't intended for production environments but are provided for testing and local development.
Compiled Windows binaries are available at windows.php.net/qa, Docker images are available at Docker Hub. For macOS, PHP 8.3.0-dev packages are available via Homebrew from shivammathur/php tap.
If you want to compile the source code yourself, you can find it on php/php-src repository on GitHub.
July 18 marks the feature-freeze for PHP 8.3. It means that all major changes to the language must be discussed and voted on prior to this date in order to make it to PHP 8.3.
Releases
The PHP development team released three new versions in June 2023:
PHP 8.2.7, PHP 8.1.20, PHP 8.0.29
All three include a security fix: GHSA-76gg-c692-v2mw. The random byte generation function used in the SOAP HTTP Digest authentication code was not checked for failure. This could result in a stack information leak.
PHP 8.2.7 and PHP 8.1.20 additionally include several bug fixes and improvements, notably in areas such as Core, Date, Exif, FPM, Hash, LibXML, MBString, Opcache, PCNTL, PGSQL, Phar, Soap, SPL, Standard, and Streams.
Recent RFCs and Mailing List Discussions
Changes and improvements to PHP are discussed, reported, and voted on by the PHP Foundation Team, the PHP development team, and contributors. Bug reports are made to the PHP issue tracker, changes are discussed in mailing lists, minor code changes are proposed as pull requests, and major changes are discussed in detail and voted on as PHP RFCs. Documentation and the php.net website changes are also discussed and improved at their relevant Git repositories on GitHub.
Hundreds of awesome PHP contributors put their efforts into improvements to the PHP code base, documentation, and the php.net website. Here is a summary of some changes made by the people behind PHP. Things marked with 💜 are done by the PHP Foundation team.
RFC Updates
Following are the RFCs and major pull-requests discussed, voted on, and implemented since our last update.
Accepted: Marking Overridden Methods by Tim Düsterhus
PHP 8.3 will have a new attribute #[\Override]. If this attribute is added to a method, the engine will validate that a method with the same name exists in a parent class or any of the implemented interfaces. If no such method exists, a compile time error will be emitted.
The similar concepts exist in Java, TypeScript, C++, C#, Swift, Kotlin, and other languages.
Implemented: Define proper semantics for range() function by Gina Peter Banyard 💜
In the forthcoming PHP 8.3 release, the range() function will have improved behavior. It will now issue warnings or throw exceptions if it receives incompatible or unusable arguments.
Implemented: mb_str_pad() by Niels Dossche
PHP 8.3 will include a new function that works similarly to the existing str_pad() function, but with support for multibyte strings. This is a welcome addition for developers working with multibyte strings, as it will make it easier to manipulate and format these strings in PHP.
In Voting: Deprecations for PHP 8.3 by Gina Peter Banyard 💜, Christoph M. Becker, Máté Kocsis 💜, Tim Düsterhus, Go Kudo, Andreas Heigl
The aim is to clean up some of the older, less consistent parts of PHP to make the language more reliable and predictable. The following list provides a short overview of the functionality targeted for deprecation:
- Passing negative
$widthstomb_strimwidth() - The
NumberFormatter::TYPE_CURRENCYconstant - Unnecessary
crypt()related constants MT_RAND_PHP- Global Mersenne Twister
In Voting: Deprecate Functions with Overloaded Signatures by Máté Kocsis 💜
This RFC proposes to deprecate a number of functions that have overloaded signatures, meaning they behave differently based on the number or type of arguments passed to them. The goal is to make PHP's function signatures more consistent and predictable.
Under Discussion: Closure self-reference by Danack, KapitanOczywisty
This RFC proposes to allow closures to be aliased to a variable that can be used within the closure:
<?php
$fibonacci = function (int $n) as $fn {
if ($n === 0) return 0;
if ($n === 1) return 1;
return $fn($n-1) + $fn($n-2);
};
echo $fibonacci(5);
Merged PRs and Commits
Following are some changes that did not go through an RFC process because they are either planned, bug fixes, or progressive enhancements.
Full list of commits since PHP Core Roundup #13
Commits are grouped by author in random order.
Click here to expand
James Lucas
- Fix GH-11246 cli/get_set_process_title in GH-11247
- Fix bug GH-9356: Incomplete SAN validation of IPv6 address in GH-11145
Gina Peter Banyard 💜
- Fix [
-Wenum-int-mismatch] compiler warnings in GH-11352 ext/standard/array.c: Optimize min/max functions for int/float in GH-11194http_fopen_wrapper: fix [-Wanalyzer-deref-before-check] in 810507ab1b- memory stream: fix [
-Wanalyzer-deref-before-check] in 13ad8ef40b - Fix file descriptor check in c5d7264149
- Assert
zend_constantexist in ce724d186d - Use known
zend_stringpointer to check for equality instead of C strings in GH-11370 - Use common function for
TypeErroron illegal offset access in GH-10544 - Use more appropriate types for
php_array_walk()function in a02f7f24c6 - More usage of known
zend_strinstead of C string in GH-11381 ext/imap: Refactor + Update to modern property write API in GH-11415- Remove
php_imap_list_add_object()function in ext/imap - Use propery API instead of
php_imap_hash_add_object()in ext/imap - Cleanup custom implementation of
rfc822_write_address()in ext/imap - Do not condition on number of arguments but on pointer being set or not in ext/imap
- Add const qualifier for
header_injection()in ext/imap - Refactor
imap_fetch_overview()in ext/imap - Narrow return type to
truein ext/imap - Refactor common conditional property assignment in ext/imap
- Move range() tests to a dedicated folder in PHP Source
- Add number or str ZPP macros in PHP Source
- Expose
zendi_try_get_long()function via a public API in Zend - Define proper semantics for
range()function in RFC
Niels Dossche
- Fix GH-11347: Memory leak when calling a static method inside an xpath query in GH-11350
- Use
zval_ptr_dtor_nogc()for callable inext/xsltin GH-11356 - Implement iteration cache, item cache and length cache for node list iteration in GH-11330
- Struct-pack
spl_dllist_objectin 5fae4b5031 - Remove dead code from
sxe_get_element_by_name()in c6bffff96b - Remove double class entry variable in 795127942b
- Use
xmlStrEqual()instead of!xmlStrCmp()in 47c277bde5 - No need for the double name pointer in ed097e30f0
- Switch
DOMNodeList::item()andDOMNamedNodeMap::item()to fast ZPP in GH-11361 - Fix bug #67440: append_node of a
DOMDocumentFragmentdoes not reconcile namespaces in GH-11362 - Fix bug #81642:
DOMChildNode::replaceWith()bug when replacing a node with itself in GH-11363 - Fix bug #77686: Removed elements are still returned by
getElementByIdin GH-11369 - Use
uint32_tfor the number of nodes in GH-11371 - Let closure created from magic method accept named parameters in GH-11364
- Disable old
libxml2hack if the version does not suffer from the bug in GH-11379 - Fix missing randomness check and insufficient random bytes for SOAP HTTP Digest in ac4254ad76
- Fix test failure for
init_fcall_003.phptwithout opcache in GH-11378 - Remove redundant assignment on nodep->ns in 6e04050474
- Fix #79700: Bad performance with namespaced nodes due to wrong libxml assumption in GH-11376
- Fix #70359 and #78577: segfaults with DOMNameSpaceNode in GH-11402
- Allow final modifier when using a method from a trait in GH-11394
- Get rid of return value for
php_libxml_unregister_node()in GH-11398 - Implement GH-8641: STREAM_NOTIFY_COMPLETED over HTTP never emitted in GH-10505
- Fix lifetime issue with getAttributeNodeNS() in GH-11422
- Fix "invalid state error" with cloned namespace declarations in GH-11429
- Fix GH-11406: segfault with unpacking and magic method closure in GH-11417
- Fix GH-11433: Unable to set CURLOPT_ACCEPT_ENCODING to NULL in GH-11446
- Fix bug #55294 and #47530 and #47847: namespace reconciliation issues in GH-11454
- Fix GH-11451: Invalid associative array containing duplicate keys in GH-11453
- Fix GH-11404:
DOMDocument::savexmland friends ommitxmlns=""declaration for null namespace, creating incorrect xml representation of the DOM in GH-11428 - [RFC] Implement
mb_str_pad()in GH-11284 - Fix GH-11507: String concatenation performance regression in 8.3 in GH-11508
- Fix interrupted CLI output causing the process to exit in GH-11510
- Fix GH-11514: PHP 8.3 build fails with
--enable-mbstringenabled in GH-11516 - Fix GH-11498: SIGCHLD is not always returned from
proc_openin GH-11509 - Fix GH-11529: Crash after dealing with an Apache request in GH-11530
- Add missing cache invalidation in
dom_child_replace_with()in PHP Source - Fix #80332: Completely broken array access functionality with DOMNamedNodeMap in PHP Source
- Fix GH-11455: Segmentation fault with custom object date properties in PHP Source
- Revert changes to
DOMAttr::$valueandDOMAttr::$nodeValueexpansion in PHP Source - Fix GH-11408: Unable to build PHP 8.3.0 alpha 1 / fileinfo extension in GH-11505
- Add missing
WUNTRACEDin GH-11526 - Fix GH-11500: Namespace reuse in createElementNS() generates wrong output in GH-11528
David CARLIER
ext/pgsql:php_pgsql_convertconvertsE_NOTICEtoTypeError/ValueErrorexceptions in 16a63d7b07ext/pgsql: adding pg_set_error_context_visibility in dd8514a0bdext/pdo_pgsql: connection status update to distinguish from truly bad quality connections in ec3daea1d6- Fix PGtrace invalid free issue in
ext/pgsql imagerotateremovesignore_transparentargument inext/gd
Tim Starling
- Set
DOMAttr::$valuewithout expanding entities in 50fdad8325 - Factor out
dom_remove_all_children()in 74910b1403 - Don't add 1 when calling
xmlNodeSetContent()in ee68c22128 - Also avoid entity expansion in
DOMAttr::$nodeValuein 076ddf2b05 - Changelog notes for
DOMAttrvalue and nodeValue properties in 0cc028c374 - Improve test
DOMAttr_entity_expansion.phptin ab77485890 - When running FPM tests, pass
-noption tophp-fpmin GH-11373
Dmitry Stogov
- Fixed deoptimization info for interrupt handler in 8f06febedf
- Keep consistent
EG(current_execute_data)after return from generator in GH-11380 - Fixed incorrect VM stack overflow checks elimination in 1a96d64828
Jakub Zelenka 💜
- Update NEWS for PHP 8.3.0alpha1 in 5b430a25fa
- Fix CS and checking for IPv6 SAN verify in 3fc013b2e2
- Fix GH-10406: fgets on a redis socket connection fails on PHP 8.3 in GH-11421
- FPM: Add "pcntl" when running another test depending on pcntl in 9b18466396
Remi Collet
- Fix GH-11382 add missing hash header for bin2hex in 0572448263
- Ensure
session.sid_lengthhave proper value for test in 0561783903 - Check
PQsetErrorContextVisibilityavailability(libpq >= 9.6)in 21aaf3321f - adapt test expectation with libzip 1.10 in b972af9589
- zip extension version 1.22.0 for libzip 1.10.0 in b5638a1202
- NEWS and UPGRADING for zip 1.22.0 in ddb6cadb4c
Pierrick Charron
- Update NEWS in b720ab99f8
Ben Ramsey
- Add example commit message to release process doc in 938ebb3b61
- Add PHP 8.3 to release process doc; remove 7.4 in ca1905116b
Florian Engelhardt
- Fix initial array size in
gc_status()in GH-11393
Mikhail Galanin
- Suppress warning when the test run under non-root in GH-11400
- sapi/fpm: add "pcntl" when running test depending pcntl_sigprocmask() in 7ade242e28
Bob Weinand
- Fix add/remove observer API with multiple observers installed in 709540ccdc
Peter Chun-Sheng, Li
- Fix cross-compilation check in phar generation for FreeBSD in GH-11441
Máté Kocsis 💜
- Add test for GH-11423 in 96ea06a1d9
- Upgrade to PHP-Parser 5.0 in 6dd62fb3d6
Ilija Tovilo 💜
- Forward shutdown exceptions to user error handlers in GH-110905
mbstring count_demeritsin reverse order in GH-11493- Fix assertion violation for invalid class const objects in const expressions in GH-11458
- Fix arm build in GH-11501
- Remove session ID set through
REQUEST_URIin f160eff441 - Revert "Mangle PCRE regex cache key with JIT option" in 4d91665f78
divinity76
- Implement
SKIP_(SLOW|ONLINE)_TESTSin GH-11479 - Support running testsuite with negative niceness in GH-11481
Alex Dowad
- Fix GH-11476: crash with count_demerits negative-size-param in 443927e3e8
Eric Mann
- Update NEWS for PHP 8.3.0alpha2 in d9e2da342a
Michael Voříšek
- Mangle PCRE regex cache key with JIT option in GH-11396
eater
- Add build scripts to "Category: Build System" label in GH-11474
Patrick Allaert
- Fixes "GC_BENCH" is not defined in extensions including
zend_gc.hin 973e9b2eec
Derick Rethans 💜
- Fixed GH-11368: Date modify returns invalid datetime in 0747616f84
Vinicius Dias
hanshenrik
- fix
file()flags error-check in GH-11483
We are incredibly grateful for the commitment and dedication of all contributors. Stay tuned for next month's roundup as we continue to make PHP better together.
Support PHP Foundation
At PHP Foundation, we support, promote, and advance the PHP language. We financially support six part-time PHP core developers to contribute to the PHP project. You can help support PHP Foundation at OpenCollective or via GitHub Sponsors.
A big thanks to all our sponsors — PHP Foundation is all of us!
Follow us on Twitter @ThePHPF to get the latest updates from the Foundation.
💜️ 🐘
PHP Roundup is prepared by Ayesh Karunaratne from PHP.Watch, a source for PHP News, Articles, Upcoming Changes, and more.