Bound-Erased Generic Types

This RFC adds generic type syntax to PHP. Classes, interfaces, traits, functions, methods, closures, and arrow functions can declare type parameters; those parameters carry bounds, defaults, and variance markers; type arguments may be supplied at use sites and at call sites via turbofish.

final readonly class Pair<+L, +R> {
    public function __construct(
        public L $left,
        public R $right,
    ) {}
 
    public function swap(): Pair<R, L> {
        return new Pair($this->right, $this->left);
    }
}
 
final readonly class Box<+T> {
    public function __construct(
        public T $value,
    ) {}
 
    public function map<U>(callable $fn): Box<U> {
        return new Box(($fn)($this->value));
    }
 
    public function zip<O>(O $value): Box<Pair<T, O>> {
        return new Box(new Pair($this->value, $value));
    }
}
 
function identity<T>(T $value): T {
    return $value;
}
 
$greeting = new Box::<string>("hello, world");
$paired   = $greeting->zip::<int>(42);
$swapped  = $paired->value->swap();
$result   = identity::<Pair<int, string>>($swapped);
Click the bar to cast your vote!
96%
4%
1

If you like it or not, generics are already used in the wild. Having a standardized syntax is, in my opinion, a no-brainer.

This RFC chooses its scope carefully, providing some safety where it is easy to do so, while delegating the rest to static analyzers and keeping backwards compatibility. With this, the different static analyzers can finally agree on certain behaviors, because they are part of the language.

Having the generic type information available through reflection opens up exciting new possibilities.

Keeping the doors open for future expansion is another very important win.

TL;DR: The RFC is very pragmatic given the design of PHP. Provides very solid foundation upon which to build that was missing and asked for a decade.

Share:
dtokos avatar
dtokos
voted yes
1

This would easily be one of the best features of modern PHP. Nobrainer.

Share:
xheaven avatar
xheaven
voted yes
1

Looking forward to this feature landing in PHP 8.6.

Share:
ahaneef29 avatar
ahaneef29
voted yes
1

Long awaited.

Share:
liu avatar
liu
voted yes
1

Yes please! This would remove a lot of docblocks everywhere. Huge PHPStan user here.

Share:
mnapoli avatar
mnapoli
voted yes
1
Share:
robindumontchaponet avatar
robindumontchapone...
voted yes
1

Yes! Time to retire the non-spec docblocks

Share:
sandermuller-2 avatar
sandermuller-2
voted yes
1

I use them everywhere.

Share:
perer876 avatar
perer876
voted yes
1

Generics are a necessary feature for all modern languages. It can reduce so much clutter and is desperately needed.

Share:
keichinger avatar
keichinger
voted yes
1
Share:
michaelcontento avatar
michaelcontento
voted yes
1

after so many years, the seems like the least obtrusive way to add generics. Really hope to see it get accepted so we don't have to keep waiting. Seems like a no-brainer tbh.

Share:
neoighodaro avatar
neoighodaro
voted yes
1

.

Share:
baukevdw avatar
baukevdw
voted yes
1

It's an opportunity to modernize PHP.

Share:
vbsessa avatar
vbsessa
voted yes
1

This feature of native generics syntax in PHP is all I ever dream of..

Share:
rcalicdan avatar
rcalicdan
voted yes
1

This is the best of all worlds. Other generic approaches have been tried and never got too far.

Bound-Erased Generics gives us a chance to get a first-party syntax that will make developers happy, allow tooling like IDEs and static analysers to pick up on it, while still leaving the implementation open for another kind of runtime/compile time generic implementation later down the line if the other possible issues with those are solved.

Share:
liam avatar
liam
voted yes

Check out another RFCs

Interface Default Methods

Interface Default Methods improves backwards compatibility when changing interfaces, but also add a way to have multi-inheritance in PHP.

95
168 yes
264 no
Asymmetric Visibility v2

A new syntax for declaring the “set” operation visibility of an object property

23
21 yes
40 no
new MyClass()->method() without parentheses

Chain method on newly created objects without parentheses

55
96 yes
16 no
RSS Feed Contribute Watch on YouTube Our License
© 2026 RFC Vote. This project is open source. Contribute and collaborate with us!