It's smarter to instantiate objects only when you need them. Creating objects takes some time and some memory. You also want to be able to know exactly what objects are in use at any given execution point in your come when you come back to change something later.
If you instantiate a bunch of objects you don't need, you'll inevitably find yourself wanting to make a change but having to spend time figuring out if you've already use $obj2 or if it's safe to start using it on line 350. If you don't name your objects more descriptively, you'll also find that you'll reuse variable names, which will cause confusion when your object doesn't act the way you expect. For example, in your code, $obj is a Bus, not an Object. If you were expecting an object, you'd be confused.