单例模式返回不同的对象

时间:2017-08-10 18:40:54

标签: php singleton

所以我在这里一团糟。我可以说我的问题很少。我尝试制作单例模式,但它返回了两个不同的对象。这就是我所做的(在另一篇文章中看到)并试图测试它。

class Singleton
{
    private static $instance = [];
    public function __construct(){}
    public function __clone(){}
    public function __wakeup(){
        throw new Exception("Cannot unserialize singleton");
    }

    public static function getInstance()
    {
        $class = get_called_class();
        if(!isset(self::$instance[$class])){
            self::$instance[$class] = new static();
        }
        return self::$instance[$class];
    }
}

class Dog extends Singleton
{
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }
}
$dog = new Dog("Jorko");
$dog2 = new Dog("Peshko");

echo $dog->name; // returns "Jorko"
echo $dog2->name; // returns "Pesho"

我认为不应该创建第二个对象($dog2),我会再次获得$dog。为什么我们在__constructor中创建空class Singleton?另外,为什么我们使用这个get_called_class?我的意思是根据php手册Gets the name of the class the static method is called in.。这就是它的回报但不是new static。我认为new static做同样的事情。我真的很乱。我在网上搜索但不能清楚地知道。非常感谢你!

1 个答案:

答案 0 :(得分:1)

实际上这是不正确的。要实现单例模式,必须保护构造函数以防止使用new运算符创建对象。魔术方法__clone__wakeup应该是私有的,以防止克隆和反序列化对象。

如果你像我所说的那样设置这些方法的可访问性,你可以通过使用静态方法getInstance()得到单例对象的实例。