Когда метод объекта PHP создает новый объект, лучше ли сохранять его как свойство объекта? - PullRequest
2 голосов
/ 06 марта 2012

Допустим, у меня есть два класса в 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 ]

1 голос
/ 06 марта 2012

Да, лучше сохранить объект Author как свойство объекта Book, если вы, вероятно, будете использовать данные автора повторно. Однако затем вам нужно беспокоиться о таких вещах, как то, что произойдет, если вы создадите экземпляр другого объекта Book с тем же автором и сохраните изменения этого автора в БД с использованием объекта новой книги. Тогда ваша оригинальная книга будет иметь устаревший объект Author с противоречивыми данными.

Propel ORM использует глобальный пул экземпляров связанных объектов, чтобы упростить этот процесс. (Хотя я не уверен, поддерживает ли он последовательность в описанной выше ситуации, потому что, кажется, я вспоминаю о встречающихся ошибках, связанных с этим, но это по крайней мере предотвращает запросы к базе данных, чтобы получить объекты, которые уже были замечены.) В любом случае, Propel - это хороший ORM с точно таким же синтаксисом для связанных объектов и полей, который вы используете, поэтому вы можете рассмотреть возможность его использования.

0 голосов
/ 06 марта 2012

Вообще говоря, довольно сложно представить себе случай, когда не ожидалось бы, что Author хранится в классе Book и что Book не будет членом свойства Books.на Author.Для них было бы неплохо «ленивой загрузкой», как это делает ваш пример, но после загрузки вы можете ожидать, что будете ссылаться на один и тот же объект с помощью повторных вызовов, а не только на одни и те же данные.

Но могут быть экземплярыгде этого не происходит, но тогда id поспорит с вашим выбором именования метода как базового метода доступа: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...