In the past I've spent a great deal of time trying to understand the different between PHP5 abstract and static classes/methods. I find out, use the differences on whatever I'm doing, and the forget. No more. I will document my understanding here to help myself, and some day others, out.
Methods (not classes) can be defined as static (eg. not static class Oliver{}
but rather static function talk()
) in order to call them without going through
an instantiated object. From my perspective, it makes code cleaner and less
messy by wrapping related functions in a class wrapper instead of defining them
globally. It should be noted though, that classes with static methods CAN be
instantiated, and those methods can be called either statically (via the ::
double colon notation, or via the -> right arrow notation on the instantiated
object).
That takes us to abstract classes. Abstract classes CANNOT be instantiated. They
can be the parent of a class which can be instantiated, but they themselves
cannot be. So for example, if I have two types of users, RegularUser
and
AdminUser
, I could create an abstract class User
which defines method
signatures (via the abstract keyword) like abstract function
login($username, $password){}
or I can define static functions which can be
called (via the same rules as above). A new User object can never be created
directly though.
So what does that mean in terms of real-world usage? Personally, if I don't want a class every to be instantiated, such as a class that has utility functions or string manipulation functions, I will define it as abstract, and define all it's methods to be static. If I have a parent object which should never be instantiated, I'll do the same, but leave the method declarations to the child classes for the most part.
So then when do I use a normal class that happens to have static methods? I haven't really. I'm sure there can be uses for it, but I've never found myself in a situation where I need to access an object's method without the context of the object's instantiation. Maybe it'll come up one day, but as I'm moving closer and closer to a full mvc based coding life style, I have a feeling that I won't find myself in that situation anytime soon.