Может кто-нибудь дать реальную задачу на которой можно применить ООП?
Это хороший вопрос, но однозначного ответа на него нет. 

Во-первых,  надо понимать, что писать свои классы и использовать готовые - это две очень большие разницы. 
От современного программиста чаще всего требуется второе. И это не требует особого понимания ООП. 

Во-вторых, учить ООП как сухую теорию, не осознавая реальной потребности в улучшении существующего кода, будет гораздо труднее.  Я убежден в том, что программист должен дорасти до ООП (я сейчас говорю не про синтаксис, а про написание своих классов и того как они взаимодействуют друг с другом). Он должен увидеть несовершенство процедурных простыней, чтобы прийти к пониманию необходимости оптимизации существующего подхода.

В-третьих, все реальные примеры настолько замороченные, что по ним разобраться совершенно нереально.  А упрощенные ничего толком не показывают. Только синтаксис. 

Я задумывался над всеми этими проблемами, но пока не смог сделать хороший наглядный пример. Только фрагменты. Вот например, как небольшой класс, который я привел в соседнем ответе. Он, будучи совсем примитивным, тем не менее показывает пример правильного наследования, использования внедрения зависимостей, и в целом показывает, как классы помогают экономить код и время программиста.

Это пример самой базовой и очень распространенной задачи - как сделать работу с SQL менее занудной и гарантированно безопасной. И начинать надо именно с таких задач, не замахиваясь на приложения целиком. 

Если говорить о приложении целиком, то стоит попробовать написать что-то примере фреймворка Symfony - это как раз даст понимание того, как ООП применяется на уровне приложения.
Про ООП есть прям отличная книжка: Гради Буч, Объектно-ориентированный анализ и  проектирование.

ЗЫ: осторожно выскажу своё мнение, что ООП нужно для удобства. Ибо банально удобнее, когда твои данные лежат рядом с методами их обработки. А не размазаны тонким слоем по всему модулю, что не понять, где чьи данные, и какими функциями они обрабатываются.