Hi internals,
While some people are trying to make PHP a stricter language I'm also
interested in making it a more flexible language by allowing to opt-in to
advanced features for people who want it.
Please don't shoot this down just because you are not the target audience of
such a feature ;-)
Toying around with PHP 8 I noticed that it is now impossible to have methods
which can be called both statically and in an object.
This proposal brings back mixed mode methods both for extensions and a new
syntax for user-land functions to explicitly allow it.
Motivation:
- Make migration of tried-and-tested mixed mode methods easier while having to
explicitly declare it. So yes, unchanged code gets the new stricter semantics
but updating code to the new (and from now on well-defined) behaviour can be
done by simply extending the function definition. Having to rewrite such code
to two different method names can be tedious and error-prone without big
benefit.
- Allowing mixed mode methods as a form of name-overload in cases having to
have two separate names for static/non-static is a WTF.
- Reviving things like
$elements = DOMDocument::loadXML($html)->childNodes;
instead of having to rewrite them to something like
($dom = new DOMDocument)->loadXML($html);
$elements = $dom->childNodes;
by adding ZEND_ACC_ALLOW_STATIC to the method signature (ext/dom/document.c
currently still contains code to handle both cases).
A first shot at an implementation was done using the syntax ?static and using
isset($this) to determine the current mode:
class A {
var $dynamic = 'dynamic';
?static function mixedmodefn() { return isset($this) ? $this->dynamic :
'static'; }
}
allowing both (new A)->mixedmodefn() and A::mixedmodefn().
The implementation (including a test) can be found at
https://github.com/php/php-src/compare/master...chschneider:optional_static
If people are interested I could create an RFC for this.
Regards,
- Chris
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php