2012-07-11 52 views
4

我要问,如果它是很好的做法,使一个类来创建自己的实例或不是,比如我有一个类:对象的方法创建的类的实例

class MyClass { 
    private $data = ""; 
    private $children = array(); 

    public function add() { 
     $x = new MyClass(); 
     // do something 
     // $x->some_method(''); 
     $this->children[] = $x; 
    } 

    public function children() { 
     return $this->children; 
    } 
} 

这样,我可以使用一些树功能,但它是否正常,或者我必须做不同的事情?

例如创建一个父类,与类的儿童和使用一个多维阵列中类A存储儿?

也许有人可以建议这样做的另一种方法?

如果有人有这方面的经验,他可以请他提供他注意到的利弊。

+2

你可以使用'$ x = new self();' – Esailija 2012-07-11 18:24:57

+0

@Esailija一个很棒的提示,谢谢! – 2012-07-11 18:25:33

回答

4

是不是很好的做法,让一个类创建自我的实例?

它取决于为什么你这样做。

如果您让课程创建自己的实例,因为您将它作为单例使用,您可以与一些人一起进入热水,了解单体设计模式。另一方面,我发现以工厂设计模式为目的的自我实例化是非常精致的。我确实建议为那个特殊情况做这件事。

+0

是的,目前我有一个任务在一个框架'CodeIgniter'中完成,它使用单例模式。也许你可以告诉更多关于如果我们正在使用单身人士会更好地使用什么?至于*为什么*我这样做,正如我所说 - 做一个树结构。 – 2012-07-11 18:28:34

1

一般来说,我不会。我唯一能看到这种情况适合的方法是,如果你在一个Singleton中使用它,看起来并非如此。

Here一篇关于构造函数最佳实践的文章。这是相当激烈的,但充满了很好的信息!

+0

正如我评论克里斯蒂安的答案,我真的在单身框架中使用它,但作为一个图书馆,它并没有扩展任何我可以以任何方式存在的东西。谢谢你的链接! – 2012-07-11 18:31:55

+0

不客气!它真的是好东西,在你停下来的时候读些东西......我没有看到任何理由,因为你以'真正的'Singleton模式使用它。 – Drewness 2012-07-11 18:44:48

+0

我在地理图书馆中使用了这种技术。坐标类上的方法用于创建该类的实例。每种方法使用不同的输入 - 纬度/长度,东/北,UTM对象等来创建坐标,但将输入标准化为单个内部数据结构。基本上,一个尺寸的构造函数并不适合所有;它允许以不同方式构建新对象,而无需使用外部工厂来完成。 – Jason 2014-06-30 01:11:19

1

我不认为这是一条既坚定又快速的规则。这取决于您尝试解决的问题空间。也就是说,如果你要创建一个像Tree这样的结构,并且该结构包含Tree类型的节点,那么树根据树的需求创建它自己的实例可能是完全合理的主题应用程序。

您还可以在Singleton设计模式中看到与您的示例大致相似的内容,您希望在其中创建一个对象的通用实例。

所以,我认为答案在于问题解决方案的适用性。希望这是有道理的。

+0

您能否扩展您的答案,关于与单身人士相似的部分?我想明白,如果它有多个对象作为父对象的子对象,它会是单身吗?我的意思是在全局范围内它将是一个单例,但在父对象的作用域中,如果它将一个类的实例用作子对象,那么它也可以是单例对象,您可以通过名称和我想实现的内容来引用 - 按名字? – 2012-07-11 18:35:07

+0

我会试一试:)我的理解是,Singleton设计模式可以保证无论多少次你可以调用一个对象的构造函数,实现都保证实际上只有一个对象被创建并返回。然而,在你的示例中,在我看来,你想要/需要*不同的MyClass实例来填充你正在讨论的树 - 否则,你的树只不过是带有一系列自引用子项的MyClass。 – 2012-07-11 19:33:18