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