Interfaces that declare properties rather than accessors, half a year after 8.4, and the one place it changed a design.
interface HasReference
{
public string $reference { get; }
}
// what it enabled: a value object with a public
// readonly property satisfies the interface with no
// boilerplate, and a class that computes it satisfies
// it with a hook.
final readonly class Invoice implements HasReference
{
public function __construct(public string $reference) {}
}
The gain is that an interface can now describe what a caller reads rather than how it is provided, so a value object and a computed one are interchangeable without either being written differently. What it does not do is let an interface require a writable property in a useful way — { get; set; } is expressible and forces every implementation to accept a write, which is rarely what is meant.