Как клон может создать новую версию синглтона?

Я спросил этот вопрос и получил хорошее решение. Я понимаю, как объект может быть создан без new (который я думал, был единственным способом построить объект).

Я узнал, что, создавая одноэлементный класс, мы заставляем класс создавать его только один раз.

// a simple singleton class.
class Singleton
{
private static $object = null;
private function __construct() {}
public static function createObject()
{
if (self::$object == null) {
self::$object = new Singleton();
}
return self::$object;
}
}

//$obj = new Singleton(); Obviously an error

$obj1 = Singleton::createObject();
// object(Singleton)[1]

$obj2 = Singleton::createObject();
// object(Singleton)[1]
// $obj1 and $obj2 are same. Both have same id = 1

$obj3 = clone $obj1;
// object(Singleton)[2]
// $obj3 is a new  instantiate. id = 2

Как это происходит? Как работает clone работать здесь?

2

Решение

Если вы хотите предотвратить клонирование синглетонов, добавьте приватный метод __clone private function __clone() {},

0

Другие решения

Я узнал, что, создавая одноэлементный класс, мы заставляем класс создавать его только один раз.

Да, если мы используем метод, который мы действительно разработали для создания объекта. Хотя идея синглтона состоит в том, чтобы совместно использовать один экземпляр объекта в приложении, он все еще остается пример объекта.

Таким образом, экземпляр объекта может быть клонирован по желанию. Ничто не мешает его клонировать. Что препятствует дублированию экземпляра — это использование createObject() метод. (Для записей это было бы лучше назвать getObject())

так по порядку:

$obj1 = Singleton::createObject();
// the method call creates the instance with new
// assigns it to the property of the singleton class
// then returns it

$obj2 = Singleton::createObject();
// the method returns the instance from the first method call
// as it is still defined in the static property
// BOTH $obj1 and $obj2 are the same instance of an object

$obj3 = clone $obj1;
// here, we use the clone keyword.
// this has nothing to do with our singleton, yet
// it simply clones an instance of an object.
// $obj1 is an instance of an object. It is therefore cloned.

Теперь, если вы действительно хотите, чтобы clone возвращал тот же экземпляр, вы можете, как упоминалось MaxP, определить __clone() магический метод в Singleton учебный класс.

function __clone()
{
return self::createObject();
}

Который вернул бы правильный экземпляр, как любой другой вызов createObject(),

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector