В чем идея методов getServiceLocatior/setServiceLocator?
Достоинства геттеров и сеттеровИспользуя геттеры и сеттеры вы можете осуществлять контроль за тем, какие именно данные содержатся в свойствах объекта, и отклонять любые некорректные значения.Так же вы можете осуществлять дополнительные операции перед тем, как установить или получить значение свойства (например, если обновление данного свойства должно вызывать некоторое действие, такое как оповещение пользователя).При установке значения, которое является объектом или массивом, вы можете явно указать тип переменной в сигнатуре функции(прим. public function setBar(Bar $bar)). К большому сожалению, PHP не позволяет проделывать тоже самое с типами int и string!Если значение свойства должно получаться из внешнего источника или среды исполнения, вы можете использовать ленивую загрузку данных — таким образом ресурсы, требуемые для загрузки данных, будут задействованы непосредственно во время получения значения свойства. Разумеется, в данном случае нужно соблюдать осторожность, и не следует получать данные из внешнего источника при каждом обращении к свойству. Будет лучше сделать одно обращение к базе данных и заполнить значения всех свойств сразу, чем делать это для каждого в отдельности.Вы можете сделать свойство доступным только на чтение или только на запись, путём создания только геттера или только сеттера.Вы можете добавить геттеры и сеттеры в интерфейс для того, чтобы отобразить их в API.Недостатки геттеров и сеттеровДля разработчиков, которые используют прямой доступ к свойствам, геттеры и сеттеры кажутся настоящей головной болью! Для каждого свойства нужно определить само свойство, геттер и сеттер; и для того чтобы использовать данное свойство в коде, нужно осуществлять дополнительные вызовы метода — намного легче написать $foo->bar++; вместо $foo->setBar($foo->getBar() + 1); (хотя, конечно, можно добавить ещё один метод $foo->incrementBar();)Как уже отмечалось выше, существуют небольшие дополнительные расходы, затрачиваемые на вызов метода.Имена геттеров и сеттеров принято начинать с глаголов get и set, но данные глаголы так же могут использоваться и в других методах, которые ни коим образом не относятся к свойствам класса.Отсюда
Обычно есть смысл в дополнительной проверке данных, сокрытии реального получения данных (нас не интересует внутренняя реализация и ее можно в любой момент изменить, а интересует только результат).
Кстати, интересное решение есть в Yii2 в классе Object (если не ошибаюсь) - там пусть и используется "магия", но довольно логичная и удобная. Нужен свой getter/setter - напиши его, а если его нет - пользуйся магическим методом.