Прямо к точке: У меня есть два одноэлементных класса, оба наследуют их одноэлементную природу от суперкласса. Я инициализирую некоторые свойства первого синглтона, а затем второй синглтон извлекает экземпляр первого. Однако этот экземпляр, похоже, не тот, который я инициализировал в первую очередь. Некоторые примеры кода могут помочь объяснить это:
Во-первых, суперкласс, обеспечивающий одноэлементный характер (требуется PHP 5.3 или выше):
class Singleton {
    protected static $instance;
    protected function __construct() { }
    final private function __clone() { }
    public static function getInstance() {
        if (!(static::$instance instanceof static)) {
            static::$instance = new static();
        }
        return static::$instance;
    }
}
Затем у нас есть первый синглтон, несущий значение:
require_once('Singleton.php');
class SingletonA extends Singleton {
    protected $value;
    public function SingletonA() {
        $this->value = false;
    }
    public function getValue() {
        return $this->value;
    }
    public function setValue($value) {
        $this->value = $value;
    }
}
Затем второй синглтон, который ссылается на первый синглтон:
require_once('Singleton.php');
require_once('SingletonA.php');
class SingletonB extends Singleton {
    public function getValue() {
        return SingletonA::getInstance()->getValue();
    }
}
Теперь для теста, который показывает, как это не удается:
require_once('SingletonA.php');
require_once('SingletonB.php');
SingletonA::getInstance()->setValue(true);
echo (SingletonA::getInstance()->getValue()) ? "true\n" : "false\n";
echo (SingletonB::getInstance()->getValue()) ? "true\n" : "false\n";
Тест дает следующий результат:
true
false
Очевидно, что экземпляр SingletonA, который ссылается на тестовый код, не является тем же экземпляром, что и экземпляр SingletonB. Короче говоря, SingletonA не такой единый, как мне нужно. Как это возможно? И какую магию я могу использовать, чтобы исправить это поведение, дав мне настоящий синглтон?