Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 单例在对象内使用或作为引用传递_Oop_Object - Fatal编程技术网

Oop 单例在对象内使用或作为引用传递

Oop 单例在对象内使用或作为引用传递,oop,object,Oop,Object,我用PHP编程,但这是一个通用的面向对象问题 从对象内部调用单例类与从外部调用单例类并传入变量相比,我们感觉如何 备选方案一: $instance = Singleton::getInstance(); $obj = new ClassName(); $obj->setSingleton($instance); 备选方案二: class ClassName { public function __construct(){ $instance = Single

我用PHP编程,但这是一个通用的面向对象问题

从对象内部调用单例类与从外部调用单例类并传入变量相比,我们感觉如何

备选方案一:

$instance = Singleton::getInstance();

$obj = new ClassName();
$obj->setSingleton($instance);
备选方案二:

class ClassName
{
     public function __construct(){
         $instance = Singleton::getInstance();
         $instance->doSomething();
     }
}
这只是一个“每次使用”的决定(即单例实现接口等),还是有规则


我可以看到传递对象与单例,但是关于单例实例与调用?想想典型的代码,它有很多类和很多单例实例的用法。。。这有什么规则吗?

两者都可以,但是当其他人查看您的代码时,他们可能不太明显地在处理您选项中的一个单件,特别是当代码变大时。当您需要连续调用它几次时,在函数体中保留单例的引用是完全有效的,但我不会将它保留为成员变量


保留一个成员变量也意味着你的对象会变得更大,没有明显的原因。

我通常根本不喜欢单例,但如果你在对象内部得到了实例,那么该对象就会与单例紧密耦合。如果代码中到处都是这种情况,那么问题就更严重了。但将实例传递给每个需要它的对象也可能同样糟糕@chatton这两种方法似乎都有缺点,但singleton的是一种非常常见的设计模式。你可以看到为什么我对这种情况很好奇是的,我认为@AlexG在他的回答中提出了一个很好的观点,即代码对任何阅读它的人来说都不那么明显。如果要选择一个,我会传递引用,而不是在方法内部调用getInstance()。