On Tue, Jun 9, 2026, at 09:26, Brent Roose wrote:
Hi Rob
Very interesting. If this is what it takes to get enough people on board, then so be it.
On a personal note, but don’t let this prevent you from further exploring this option: I hope that at some point we get a way to opt out of runtime type checks (generics or types in general). A 2x performance penalty is a serious issue.
To reiterate what I’ve said before: generics aren’t a runtime tool. Their value comes from static analysis and reflection for meta programming, and I see no reason why generic code should be type-checked at runtime when it has already been type-checked before. As both a PHP user and a representative for one of PHP’s most used static analysers, I want three things: a proper spec, proper syntax, and proper reflection. All these problems are solved with the current RFC; without runtime type checking, and without performance penalties.
Maybe this is just a necessary process for PHP to go through; and who knows, in a couple of years, practical experience will have shown and convinced enough people that it’s unnecessary. I’ll happily deal with the performance overhead and will continue to hope for an opt-out mechanism in the future.
Thanks for the work and effort, really interesting!
Brent
Please remember to “bottom post” (put your reply at the bottom, not the top, of the email).
A 2x performance penalty is a serious issue.
This is a mischaracterization. To be more clear, the call itself approaches a limit of 2x – it isn’t exactly 2x, and not all generic calls are always 2x. I even gave real examples in my email showing real world generic heavy code is only 30-50% slower. And this is without any real optimization work. This is the ceiling, not a final result. Further, it appears to bear the same cost as manually type checking the generics.
I see no reason why generic code should be type-checked at runtime when it has already been type-checked before
PHP does type checks at runtime because it cannot be type-checked before. There is no point where the compiler can be sure about types statically. Each file is compiled at a time, and some parts of compilation even need to be deferred to runtime. This isn’t a limitation of PHP, it’s how you can have two files with the same class name in them and then load different ones depending on capabilities/execution. (ie, loading generated mocks instead of the real class or loading a php 8.3 version instead of a php 9 version of the class).
I know of absolutely zero static analysis tools that understand PHP’s dynamic loading system – they all assume a PSR-4 (or similar) system for autoloading. Thus, only in certain kinds of cases are they actually useful.
All these problems are solved with the current RFC; without runtime type checking, and without performance penalties.
I disagree, wholeheartedly. But that is likely because during my work, I had to actually fix tests from the erasure branch that “looked” right but were quite wrong. As I mentioned in my email, the cost turns out to be nearly exactly the same as manual type checks. The performance issue is a mirage if you want to do any type assertions – and you probably do. As I mentioned in my last email, you can simply write a script today to remove all types in your code. There’s nothing stopping you from doing that to get some “speed”.
— Rob