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

Reply via email to