The "static" keyword is used for late static binding, which basically means that when you run MyOtherProvider::getInstance(), all the "static" references like "static::$_instance" resolve to the calling class, so it's like automatically determining either MyOtherProvider::$_instance or MyProvider::$_instance, depending on which class is being called.
The protected static $_instance is there to ensure that each class has its own property to hold the class instance.
In theory, you could even shorten all of this up into nothing but static methods and properties, too:
abstract class MyOtherProvider
{
// Class properties
public static $FieldY;
public static function MakeMoreExciting($sentence)
{
return $sentence . "!!!!!!";
}
}
echo MyOtherProvider::MakeMoreExciting("Hi there"); // Hi there!!!!!!
Although sometimes you might want an actual instance rather than just being completely static.