当PHP对象方法创建新对象时,最好将其保存为对象属性吗?

时间:2012-03-06 04:44:08

标签: php performance oop class object

假设我在PHP中有两个类,一个书类和一个作者类。让我们说我要创建一个新的图书对象。

// $book is now a book class
$book = new book('War and Peace');

现在让我说我想要那本书的作者。为此,我的对象设置要求我从书中获取作者类。

// gets an author class chained with a method to get it's name
$author = $book->getAuthor()->getName();

在$ book-> getAuthor()调用中,最好将作者对象“保存”到书中的属性吗?

public function getAuthor()
{
    if(is_null($this->author_object)) {
        $this->author_object = new author($this->author_name);
    }
    return $this->author_object;
}

这个例子可能不是最好的,但我希望它能很好地代表我的问题。此外,我已经知道数据库查找是一个很大的性能影响,所以假装现在不需要。

基本上我的问题是什么更好,如果需要再次创建作者对象,或者将作者对象保存为属性,因此不需要再次创建。

2 个答案:

答案 0 :(得分:1)

是的,如果您可能重新使用作者数据,最好将Author对象另存为Book对象的属性。但是,您必须担心如果您实例化具有相同作者的另一个Book对象会发生什么,并使用新Book对象将更改保留给DB。那么你的原始书籍将有一个过时的作者对象,数据不一致。

Propel ORM使用全局Instance Pool相关对象来简化此过程。 (虽然,我不确定它是否真的保持了上述情况的一致性,因为我似乎记得遇到了与此有关的错误,但它至少会阻止数据库查询获取已经看过的对象。)在无论如何,Propel是一个很好的ORM,它与您使用的相关对象和字段的语法完全相同,因此您可能需要考虑使用它。

答案 1 :(得分:0)

一般来说,很难想象一种情况,即Author类中存储Book并且Book不会成为成员的期望Books上的Author属性。对于他们来说,“延迟加载”就好了,这就是你的例子所做的,但是在加载之后你会期望通过重复调用引用相同的对象,而不仅仅是相同的数据。

但是可能会出现这样的情况,但是然后我会选择将方法命名为基本访问器: - )