所以我在这里一团糟。我可以说我的问题很少。我尝试制作单例模式,但它返回了两个不同的对象。这就是我所做的(在另一篇文章中看到)并试图测试它。
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
做同样的事情。我真的很乱。我在网上搜索但不能清楚地知道。非常感谢你!
答案 0 :(得分:1)
实际上这是不正确的。要实现单例模式,必须保护构造函数以防止使用new运算符创建对象。魔术方法__clone
和__wakeup
应该是私有的,以防止克隆和反序列化对象。
如果你像我所说的那样设置这些方法的可访问性,你可以通过使用静态方法getInstance()
得到单例对象的实例。