This document discusses object-oriented programming (OOP) and how to rethink OOP. It defines OOP, describes its basic concepts like objects, classes, inheritance, abstraction and polymorphism. It also discusses problems commonly encountered with OOP like meaningless inheritance and lack of planning. The document provides examples in PHP to illustrate OOP concepts and compares procedural code with OOP code for a bank account transfer scenario.