Чтобы устранить необходимость в геттерах и сеттерах, интерфейс должен иметь возможность указать, какие свойства он включает и таким образом в довесок к тому изначально чего он был создан этот RFC также добавляет возможность для интерфейсов асимметрично объявлять публичные свойства. Класс реализации может предоставить свойство как через обычное свойство так и через хук. Любого способа из них достаточно для удовлетворения интерфейса.
Рассмотрим сначала за пример код указанный в RFC:
interface I
{
// Класс, реализующий интерфейс ДОЛЖЕН иметь публичное свойство,
// но независимо от того, является ли оно публичным или нет - ограничений нет.
public string $readable { get; }
// Класс реализации ДОЛЖЕН иметь публичное свойство для записи,
// но независимо от того, доступно ли оно публичному чтению или нет - ограничений нет.
public string $writeable { set; }
// Класс реализации ДОЛЖЕН иметь свойство, которое является публичным и
// доступно для чтения и записи.
public string $both { get; set; }
}
ну и что-нибудь такое из примеров предыдущих постов:
interface User
{
// Объекты, реализующие этот интерфейс, ДОЛЖНЫ иметь возможность
// получить свойство $fullName. Этого можно добиться обычным
// свойством или свойство с хуком get.
public string $fullName { get; }
}
class Customer implements User
{
// Хук get необязателен,
// свойство будет доступно для чтения даже без хука get.
public function __construct(public string $fullName) {}
}
свойство $fullName будет прекрасно читаться и без хука get. Но если мы определим хук get для свойства, оно будет доступно для чтения именно с помощью хука get.
Интерфейсы могут быть связаны только с публичным доступом, поэтому наличие приватных свойств не зависит от интерфейса и не может удовлетворить интерфейс. Это та же самая логика, что и для методов. Ключевое слово public свойства необходимо для обеспечения согласованности синтаксиса (или его редко используемый псевдоним var).
Следует отметить, что свойство интерфейса, которое требует только хук get может удовлетворяться общедоступным readonly свойством, поскольку ограничения readonly применяются только при записи. Однако свойство интерфейса, которое требует хук set несовместимо с readonly свойством, поскольку публичная запись будет запрещена.