可以克隆对象在单例模式中具有相同的范围吗?

时间:2018-05-31 18:16:12

标签: php scope singleton-methods

就我而言,我在下面创建了一个单例对象检查 -

  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 个答案:

答案 0 :(得分:0)

请阅读此内容,也许您会发现另一种设计模式,非常适合您的情况。这篇文章对我有很大帮助

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

答案 1 :(得分:0)

  

然后$ obj和$ obj1有不同的范围原因?

因为他们绝对没有理由共享相同的“范围”,如果你的意思是同一个实例。您使用您所使用的方法实现了该单例,但这对PHP的其余行为没有影响。克隆构造不使用您的create_obj()方法,因此它不会是单例。

  

如果克隆然后共享相同的范围,如何只创建一个对象?

不使用克隆。如果您希望您的类成为使用此方法的单例,则需要始终使用单例创建方法。

这很难说清楚,但似乎你在这里有相互矛盾的目标。如果您需要两个不同的对象实例但表示同一个实例,只需使用对象的相同实例。几乎没有区别。

如果您需要在整个脚本执行过程中使用对象的单个实例,则不需要单例,只需将其实例化一次,然后将其传递给需要它的每个其他对象。对象在PHP中以类似引用的方式传递,这意味着如果将它传递给不同的函数,则所有函数都将作用于同一个实例。