Прямо к точке: У меня есть два одноэлементных класса, оба наследуют их одноэлементную природу от суперкласса. Я инициализирую некоторые свойства первого синглтона, а затем второй синглтон извлекает экземпляр первого. Однако этот экземпляр, похоже, не тот, который я инициализировал в первую очередь. Некоторые примеры кода могут помочь объяснить это:
Во-первых, суперкласс, обеспечивающий одноэлементный характер (требуется 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 не такой единый, как мне нужно. Как это возможно? И какую магию я могу использовать, чтобы исправить это поведение, дав мне настоящий синглтон?