public — доступно звідусільprotected — лише в класі та підкласахprivate — лише в класі (найсуворіший)readonly (PHP 8.1+) — записати можна лише в конструкторіКлас може змінити внутрішню реалізацію без впливу на зовнішній код. Приклад: змінили зберігання балансу з int на Money VO — зовнішній код не знає про це, бо звертається тільки до getBalance().
Не обов'язкові — це деталь реалізації. Дублювати поле $name геттером getName() без причини — порушення DRY. Відкривайте лише те, що справді потрібно зовні.