This is a few years old, but I just ran into a issue where I have a base class
class GeneralObject
{
    protected static $_instance;
    public static function getInstance()
    {
        $class = get_called_class();
        if(!isset(self::$_instance))
        {
            self::$_instance = new $class;
        }
        return self::$_instance;
    }
}
That has a Child Class
class Master extends GeneralObject 
{
}
And another Child class
class Customer extends Master 
{
}
But when I try to call
$master = Master::getInstance();
$customer = Customer::getInstance();
then $master will be Master as expected, but $customer will be Master because php uses the GeneralObject::$_instance for both Master and Customer
The only way I could achieve what I want was to change the GeneralObject::$_instance to be an array and adjust the getInstance() method.
class GeneralObject
{
    protected static $_instance = array();
    public static function getInstance()
    {
        $class = get_called_class();
        if(!isset(self::$_instance[$class]))
        {
            self::$_instance[$class] = new $class;
        }
        return self::$_instance[$class];
    }
}
I hope this helps someone else out there. Took me a few hours to debug what was going on.