[PHP-DEV] Generics

[email protected] (Henrik Skov)
Newsgroups php.internals
Message-ID <[email protected]>
Hi list !

As someone who wants generics in PHP, please make the generics opt-in 
(via INI setting or declare()) - PHP is slow enough as it stands now - 
and adding reified generics will just make it even slower.

I was very sad to see that the only feasable kind of generics (type 
erased) in PHP had its RFC declined.

By making the reified generics opt-in, extension authors may still 
implement type erased generics and thus avoid the performance penalty - 
altough as extension cannot change PHP parsing - their would rely on two 
small changes to PHP itself (please see below)

Imagine two ways forward (to type-erased generics):

1. By wrapping generic "expressions" in comments ie.: $x = new 
Collection/*<int>*/();
      all IDEs would have no problems with generics - The community 
might even make plugins for all popular IDEs that check such generic 
expression against the codebase from inside the IDE (the place where it 
actually matters) - I did one as an expieriment a while back for VSCode 
myself

2. We might of course also imagine the slighty more troublesome path 
forward:
     Two new tokens were added to PHP:

|< (interpreted as /*)
and
 >| (interpreted as */)

This option would of course need IDE plugins to be updated to understand 
the new syntax

Regardless of going with 1 or 2, at compile time, all PHP would have to 
do was to substitute generic function/method parameters (such as T, K or 
V) with mixed
ie (in a class Collection/*<T>*/ :
.
public function add(T $item) : T {

}

T would be replaced by mixed - PHP would have to have a known list of 
such generic type parameter names (T, K, V - but it might be 
configurable as an INI setting)

A declare() at the top of a file could hint the compiler if this file 
needs the replace / if it uses generics

This approach would then leave the actual checking of the validity of 
any generic expressions/code to an extension (written in C) for instance 
via a method such  as:

/* {{{ proto int myextension_check_generics(string $dir)
     Verify usage of generics in $dir recursively */
PHP_FUNCTION(myextension_check_generics)
{
....
      RETURN_TRUE
}

This extension function would basically do what Psalm etc. do today - 
just in C for much better performance

I am well aware that the internals list is set on reified generics, but 
I still think that that would be another wrong turn by PHP (just like 
the pipe operator and more)

I do agree that the wrapping |< and >| appears ugly but just wanted 
something that required as few changes as possible.

Just my 5 cents...


/Henrik



-- 



Med venlig hilsen

Henrik Skov
/HSK Consulting/
Blegdamsvej 128B, 4
DK-2100 Copenhagen O
Tel.: +45 27 62 83 01
Email: [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.