开门见山: 我有两个单身人士课程,都是从超级课程继承他们的单身人士。我在第一个单例上初始化一些属性,然后检索第二个单例 该 第一个的例子。然而,那个例子似乎并不是我最初初始化的那个例子。一些示例代码可能有助于解释这一点:
首先,超类,提供单例性质(需要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并不像我需要的那样单一。这怎么可能?我能用什么魔法来弥补这种行为,给我一个真正的单身人士?