Re: Class Extension
| From: | Holly Schilling | Date: | Wed, 08 Jul 2026 16:27:02 +0000 |
| Subject: | Re: Class Extension | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-131819@lists.php.net to get a copy of this message | ||
I like how extensions in Swift allow to organise code!
If we ignore implementation details and ownership it's pretty similar to what we have with
traits. In PHP, what would be the benefit of extensions over traits? One thing that comes to my mind
is that traits can be used by whatever chooses to add it (back to ownership). Good one, but what
else? If ownership is the only concern then maybe a small addition to traits could achieve the same?
```
trait Foo
{
for Baz\Bar::class; // inverse of "use" to limit usage
}
class Bar
{
use Foo;
}
```
Brings conflict resolution for free; and I think it would be cheaper than yet another class-like
thing. Maybe also feels more php-ish since we already have the trait concept?
Thanks for the feedback, Nick.
An extension is essentially the reverse of a trait. With a trait, the trait use is declared within
the class definition and all users of the class get those methods. With an extension, they are
generally NOT declared by the one who defines the class. They are instead declared by the user of
the class. They are purely syntactic sugar, but they are very nice to have. You can see my example
with \DateTimeImmutable I sent earlier for an example.
It’s a feature for what I’ve called Phase 2, but scoping the extensions is where they become
powerful. An extension can provide functionality similar to a default implementation on Interface,
although the method cannot be a required member on the interface.
Holly