在PHP 5.3中创建Singleton基类

Joh*_*ren 10 php singleton

直截了当:我有两个单身人士课程,都是从超级课程继承他们的单身自然.我在第一个单例上初始化一些属性,然后让第二个单例检索第一个单例实例.然而,那个例子似乎并不是我最初初始化的那个例子.一些示例代码可能有助于解释这个:

首先,超类,提供单例性质(需要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;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后我们得到了第一个带有值的单身人士:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后引用第一个单例的第二个单例:

require_once('Singleton.php');
require_once('SingletonA.php');

class SingletonB extends Singleton {

    public function getValue() {
        return SingletonA::getInstance()->getValue();
    }

}
Run Code Online (Sandbox Code Playgroud)

现在进行测试,显示失败的原因:

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";
Run Code Online (Sandbox Code Playgroud)

测试产生以下输出:

true
false
Run Code Online (Sandbox Code Playgroud)

显然,测试代码引用的SingletonA实例与SingletonB实例引用的实例不同.简而言之,SingletonA并不像我需要的那样单一.这怎么可能?我能用什么魔力来弥补这种行为,给我一个真正的单身人士?

lon*_*day 11

尝试使用isset而不是instanceof:

class Singleton {
    protected static $instances;

    protected function __construct() { }

    final private function __clone() { }

    public static function getInstance() {
        $class = get_called_class();

        if (!isset(self::$instances[$class])) {
            self::$instances[$class] = new $class;
        }
        return self::$instances[$class];
    }
}
Run Code Online (Sandbox Code Playgroud)