Values of static proptery's are shared over all classes of the same type:
class foo{
static $bar;
function __construct($set = null){
if($set){
self::$bar = $set;
}
echo self::$bar;
}
}
$a = new foo(1); // 1
$b = new foo(); // 1
They are very useful to hold (for example) a resources to share across the entire class, like a database connection. It can also be used for keeping statistics on how many calls have been made to a specific function, etc.
Now static methods are useful for keeping a code grouped inside the same scope, interacting with the class that may not need the instance of the class to function.
They may for example return a static variable that holds an instance of a class. Because they are essentially methods, they are bound to follow interfaces and you can force a class to have a static method called getInstance()
to have the same flow as other one-time classes. (hint, it works great with traits)