Я считаю, что в этом вопросе, как и в любом другом, не нужно прибегать к крайностям, т.е. как нигде не использовать публичные поля, так и использовать их везде — плохо. В частности, неразумно использовать класс с 20-ю приватными полями, для каждого из которых есть методы getX и setX.
Например, в C/C++ есть структуры (struct), а на использовании структур построена большая часть всяких API. И ничего плохого в этом не вижу. В PHP структур нет, но их роль могут играть классы с публичными полями.
Еще, я думаю, разумно использовать публичные поля в той части системы, которая не видна наружу, т.е. где весь код находится под вашим контролем. Это иногда позволит сделать код чище и лаконичней.
Еще, например, там, где объект используется для одноразовой передачи блока информации, и последующее изменение полей никак не повлияет на работоспособность системы (скажем, объект $event с полями name, type, sender, message). И т.п.