0

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

  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如果克隆然后共享相同的范围,如何只创建一个对象?

4

2 回答 2

1

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

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

于 2018-05-31T18:22:49.763 回答
0

那么 $obj 和 $obj1 为什么会有不同的作用域呢?

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

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

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


仅凭这一点很难说,但您似乎在这里有相互矛盾的目标。如果您需要一个对象的两个不同实例但代表同一个实例,只需使用该对象的同一个实例即可。几乎没有区别。

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

于 2018-05-31T19:08:52.903 回答