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]

Reply via email to