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中,对象是以类似引用的方式传递的,这意味着如果将其传递给不同的函数,则所有函数都将作用于同一个实例。使用克隆违反了单例模式,我通常在创建单例时将其设为私有函数。如果是单例,则可以简单地将所有内容设为静态属性,所以它们都在同一个范围内。你想实现什么?目标是什么?虽然这在理论上可以回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。