Может ли объект-клон иметь одинаковую область действия в синглтоне

В моем случае я создал проверку одноэлементного объекта ниже:

  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 есть различие области применения, почему? А как создать только один объект, если клонировать то же самое?

0

Решение

Тогда $ obj и $ obj1 имеют разную область видимости, почему?

Потому что у них нет абсолютно никакой причины делить одну и ту же «область видимости», если под этим вы подразумеваете один и тот же экземпляр. Вы реализовали этот синглтон, используя метод, который вы сделали, но это не влияет на остальную часть поведения PHP. Конструкция клона не использует ваш create_obj() метод, поэтому он не будет синглтоном.

А как создать только один объект, если клонировать то же самое?

Не используя клон. Если вы хотите, чтобы ваш класс был одноэлементным с этим методом, вам нужно всегда использовать ваш метод создания одноэлементного класса.


Об этом трудно судить, но, похоже, у вас здесь противоречивые цели. Если вам нужны два разных экземпляра объекта, но представляющих один и тот же экземпляр, просто используйте тот же экземпляр объекта. Там практически нет разницы.

Если вам нужен один экземпляр объекта, который будет использоваться на протяжении всего выполнения скрипта, нет необходимости в синглтоне, просто создайте его экземпляр один раз, а затем передайте его каждому другому объекту, который в этом нуждается. Объекты передаются в PHP как ссылки, что означает, что если вы передадите их разным функциям, все функции будут работать с одним экземпляром.

0

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

Пожалуйста, прочитайте это, может быть, вы найдете другой шаблон дизайна, который очень удобен для вашего случая. Эта статья мне очень помогает

https://github.com/kamranahmedse/design-patterns-for-humans

0

По вопросам рекламы [email protected]