Php 克隆对象能否在单例模式中具有相同的作用域?

Php 克隆对象能否在单例模式中具有相同的作用域?,php,scope,singleton-methods,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; } } 然后在下面创建对象

在我的例子中,我在下面创建了一个单例对象检查-

  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有不同的范围为什么?如果克隆共享同一作用域,如何只创建一个对象

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

那么$obj和$obj1有不同的范围为什么

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

如果克隆共享同一作用域,如何只创建一个对象

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

这很难从中分辨出来,但你似乎在这里有着相互矛盾的目标。如果需要一个对象的两个不同实例,但表示同一实例,只需使用该对象的同一实例即可。这几乎没有区别


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

使用克隆违反了单例模式,我通常在创建单例时将其设为私有函数。如果是单例,则可以简单地将所有内容设为静态属性,所以它们都在同一个范围内。你想实现什么?目标是什么?虽然这在理论上可以回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。