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