In my last tutorial, What Object-Oriented Programming Is NOT, I mentioned that over-using or mis-using the static keyword is one way developers get confused with object-oriented programming. That, often, they simply take their procedural code, dump into a class, make everything static and away we go.
That said, there CAN be legitimate uses for fully static classes.
I like the answer Pascal MARTIN gave on StackOverflow:
The distinction I make is this:
- Use an instantiated class for actual objects in your applications (post, category, user, etc)
- Use a static class for “libraries of code” that have useful functions
As Pascal said, that’s probably over-simplified, but it helps me keep my head straight. Of course, the question becomes… how do we write a static class.
The first thing to keep in mind is “once you go static, you can’t go back”… in a way. More specifically, you can’t use object properties or methods in static methods. So, this won’t work:
<?php class Library { public $var = 'Hey'; public static function do_stuff() { echo $this->var; } } Library::do_stuff(); // Triggers: Fatal error: Using $this when not in object context
That’s because $this references and instantiated object. But, we bypass that when using static methods. So, $this essentially doesn’t “exist”. But, you might think you could do this:
<?php class Library { public $var = 'Hey'; public static function do_stuff() { echo Library::$var; } } Library::do_stuff(); // Triggers: Fatal error: Access to undeclared static property: Library::$var
So, once you declare a method static… basically everything it touches has to be static, too. Thus, this is what works:
<?php class Library { public static $var = 'Hey'; public static function do_stuff() { echo Library::$var; } } Library::do_stuff(); // Outputs "Hey"
One way you might use this, then, is something like this:
<?php class Library { public static $date_format = 'F jS, Y'; public static function format_date($unix_timestamp) { return date(self::$date_format, $unix_timestamp); } } echo Library::format_date(time()); // Outputs formatted date
The format_date() method is one that could be used in various places throughout your application and wouldn’t need constantly re-instantiated to use. And, of course, this Library class could contain various, similar methods that have data-agnostic uses. A kind of “catch-all” for miscellaneous functions.
And, of course, as you’ve seen the way to make a property or method static is to simply add the “static” keyword to the declaration, like so:
<?php class Library { public static $var = 'Hey'; public static function do_stuff() { // do stuff } }
So, there you go. Now, if you want to keep going and learn how to build professional PHP applications using object-oriented programming, then check out my full object-oriented programming course here (also available on Udemy here).