Может ли объект-клон иметь одинаковую область в шаблоне синглтона?
В моем случае я создал проверку одноэлементного объекта ниже:
class Foo {
private static $obj = null;
public static function create_obj () {
if (self::$obj === null) {
self::$obj = new self;
}
return self::$obj;
}
}
Затем создайте проверку объекта ниже
$obj = Foo::create_obj();
Затем клонируйте $obj затем
$obj1 = clone $obj;
затем $obj
а также $obj1
есть различие области применения, почему? А как создать только один объект, если клонировать то же самое?
2 ответа
Тогда $obj и $obj1 имеют разную область видимости, почему?
Потому что у них нет абсолютно никакой причины делить одну и ту же "область видимости", если под этим вы подразумеваете один и тот же экземпляр. Вы реализовали этот синглтон, используя метод, который вы сделали, но это не влияет на остальную часть поведения PHP. Конструкция клона не использует ваш create_obj()
метод, поэтому он не будет синглтоном.
А как создать только один объект, если клонировать то же самое?
Не используя клон. Если вы хотите, чтобы ваш класс был одноэлементным с этим методом, вам нужно всегда использовать ваш метод создания одноэлементного класса.
Об этом трудно судить, но, похоже, у вас здесь противоречивые цели. Если вам нужны два разных экземпляра объекта, но представляющих один и тот же экземпляр, просто используйте один и тот же экземпляр объекта. Там практически нет разницы.
Если вам нужен один экземпляр объекта, который будет использоваться на протяжении всего выполнения скрипта, вам не нужен одиночный экземпляр, просто создайте его экземпляр один раз, а затем передайте его каждому другому объекту, который в этом нуждается. Объекты передаются в PHP как ссылки, что означает, что если вы передадите их разным функциям, все функции будут работать в одном экземпляре.
Пожалуйста, прочитайте это, может быть, вы найдете другой шаблон дизайна, который очень удобен для вашего случая. Эта статья мне очень помогает