Q:

Creating a new instance of class being called rather than parent

How can I return an instance of the class being called, when the method is in a parent class. 
Eg. In the example below, how can I return an instance of B if I call B::foo();?
abstract class A
{
    public static function foo()
    {
        $instance = new A(); // I want this to return a new instance of child class.
             ... Do things with instance ...
        return $instance;
    }
}

class B extends A
{
}

class C extends A
{
}

B::foo(); // Return an instance of B, not of the parent class.
C::foo(); // Return an instance of C, not of the parent class.

I know I can do it something like this, but is there a neater way:
abstract class A
{
    abstract static function getInstance();

    public static function foo()
    {
        $instance = $this->getInstance(); // I want this to return a new instance of child class.
             ... Do things with instance ...
        return $instance;
    }
}

class B extends A
{
    public static function getInstance() {
        return new B();
    }
}

class C extends A
{
    public static function getInstance() {
        return new C();
    }
}

A:

$instance = new static;

You're looking for Late Static Binding.

