【问题标题】:When a PHP object method creates a new object, is it best to save it as an object property?当 PHP 对象方法创建新对象时,是否最好将其保存为对象属性?
【发布时间】:2012-03-06 04:44:08
【问题描述】:

假设我在 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;
}

这个例子可能不是最好的,但我希望它很好地代表了我的问题。另外,我已经知道数据库查找对性能有很大影响,所以暂时不需要这样做。

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

【问题讨论】:

    标签: php performance oop class object


    【解决方案1】:

    是的,如果您可能重复使用作者数据,最好将 Author 对象保存为 Book 对象的属性。但是,您必须担心如果您实例化另一个具有相同作者的 Book 对象,并使用新 Book 的对象将对该作者的更改持久保存到数据库中会发生什么。那么您的原始 Book 将有一个过期的 Author 对象,其中包含不一致的数据。

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

    【讨论】:

      【解决方案2】:

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

      但是在某些情况下可能不会发生这种情况,但是我会与您选择将方法命名为基本访问器的选择发生争执:-)

      【讨论】:

        猜你喜欢
        • 2018-12-19
        • 1970-01-01
        • 1970-01-01
        • 2012-07-17
        • 2019-07-11
        • 2018-04-23
        • 1970-01-01
        • 1970-01-01
        • 2020-02-27
        相关资源
        最近更新 更多