Вам все правильно советуют, но нужно все объединить:
1. Для сокрытия реализации класса нужно использовать интерфейсы.
2. Что касается $dk = new FileDataKeeper; - то решение этой проблемы - Фабрика. Вы создаете еще один клас-фабрику Factory с методом скажем getStorrage(); Для каждого варианта хранилища у вас будет свой клас (FileDataKeeper, MySQLDataKeeper ...). Получим:
$dk = Factory::getStorage();
А вот getStorage() будет анализировать ситуацию и возвращать или new FileDataKeeper() или new MySQLDataKeeper() плюс его реализация тоже будет закрыта.
В итоге пользователю мы даем информацию о интерфейсе (доступные методы) и метод для получения класса хранилища.