How can I be sure reading your code that the 34 is related to 45? how can i be sure that the “sayName” method is not getting the data from a global or internet service, or database,….? or modified a pseudo-global (property, that for the case, is the same, because it is outside of the scope of the function/method).
How can I be sure where the haveBirthDay method is declared? In User? or SuperUser? or SuperSuperUser? or Entity? or super Entity? or one of their 1000 parents? How can I be sure that making an innocent instance will not blow my memory because of all the inheritance dependencies (plus others)? If there is polymorphism, how can I find the right method to call?
Why the haveBirthday is destructing the previous state instead of returning a new object with the new state? (not a problem of OOP by its own, but all php libraries are mutable, not you: DateTimeImmutable)
Can you see now? Man, the OOP doesn’t fix any issue of the procedural style. It just adds more.