CMS не обязательно. Что бы разобраться можно посмотреть курс Дмитрия Лаврика про ООП.
Если про задачу - вот пример, из моей практики. Немного корявый, но для изучения самое то.
В разных местах нужно записывать определенные данные пришедшие от пользователя на диск либо в базу данных. (можно еще в Redis, если понятно что это), в зависимости от... ну допустим типа пользователя. Перед тем как эти данные записывать, нужно сделать несколько стандартных проверок.
Соответственно нужен объект, который будет
хранить данные,
проверять их,
сам выбирать способ записи,
выдавать определенную ошибку если данные не прошли проверку
и иметь стандартную процедуру записи. (что-нибудь типа saveData() )
Желательно предусмотреть так, что бы способ записи был расширяемый, т.е. возможно будут еще какие-то другие хранилища, а значит нужны интерфейсы для классов, т.е. наш объект должен принимать объекты которые непосредственно делают запись на какой-то носитель.
p.s. профессионалов просьба не ругаться, понятно, что с тестированием, DI и прочими классными штуками решение будет несколько другое.