Посмотрите на код в getInstance
:
if(!(self::$instance instanceof self))
self::$instance = new self();
Все эти self
указывают на A
, а не на класс, который был вызван. В PHP 5.3 вводится то, что называется «поздняя статическая привязка» , что позволяет указывать на вызываемый класс, а не на класс, где существует код. Вам нужно использовать ключевое слово static
:
class A{
protected static $instance; // converted to protected so B can inherit
public static function getInstance(){
if(!(static::$instance instanceof static))
static::$instance = new static(); // use B::$instance to store an instance of B
return static::$instance;
}
public function doStuff(){
echo 'stuff';
}
}
К сожалению, это не удастся, если у вас по крайней мере не установлен PHP 5.3.