PHP 8: Method Overloading, The Ressurection
| From: | David Rodrigues | Date: | Sun, 03 Feb 2019 18:39:03 +0000 |
| Subject: | PHP 8: Method Overloading, The Ressurection | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-104073@lists.php.net to get a copy of this message | ||
Hello everybody!
I know that method overloading was discussed on past and because a lot of
reasons it was declined [1]. I think that it should be considered maybe for
PHP 8, but for now I would like to suggest a different implementation.
Because of a stronger support to parameter types that PHP has now, I think
that is possible make this process more faster than before by handling it
only in case of exceptions. I wil explain better.
The biggest problem that I see about this topic is the loss of performance,
but I think that it could be avoided by create a new keyword "overload"
that should be applied before methods that could be overloaded. For
instance:
overload function sum(int $a, int $b): int;
overload function sum(float $b, float $b): float;
In this case, when call a method PHP could identify if it have a overloaded
implementation, so ONLY in this case it will reduce performace to decided
which implementation it should call.
I don't know how PHP could treats it internally, but when overload keyword
is identified, I think that it could generates a hash like
"sum/int,int/int" and "sum/float,float/float" (method name, parameters
types, return type). I don't know. So when method is called, it should
convert the argument types and create a similar hash, making possible to
identify what overloaded method should be run. It seems slow, but I think
that the opcache could simplify the next operations to connect directly the
call to the correct overloaded method.
Please, tell what do you think, because I really wants method overload on
PHP 8 or before. Currently we should do some code hacks to make it possible
that certainly is slower than a native implementation.
Thanks!
[1] https://marc.info/?l=php-internals&m=121397217528280&w=2
--
David Rodrigues