As my near-namesake says, the main purpose of getters and setters is side effects. The reason you would always use getters and setters is code maintainability.
Say you have a 10000+ lines-of-code project, and you have assignments to $foo->bar
strewn all over. Then suddenly you decide you want to log every time foo's bar changes. With direct access, you need to go through your entire code base and find all the assignments. If you have a setter, it's a matter of adding a single line of code: nothing changes at the place the assignment is made.
Or, say you have an age property that is calculated in the constructor. Some time later, you decide it is not good enough; you want to calculate it every time you need it. This requires a function, direct access is not going to cut it. If you start with the direct access, you need to change every single instance of it into a function call. If you start with a trivial getter, you can change return $this->age
into a date calculation or a database call or whatever you want by just modifying the getter: nothing else changes.
Ruby makes this into a general dogma: there are no public properties, only getters/setters (called accessors in the Ruby world), precisely because the only interaction allowed to the objects is message-passing (unless you employ magic). Ruby also makes creating trivial getters/setters... err, trivial, which makes it a negligible impact on development time. In PHP, you are given a choice.