структура класса php для презентации - PullRequest
1 голос
/ 26 мая 2011

Мне нужен совет опытных разработчиков по этому вопросу.Позвольте мне перейти прямо к этому.

У меня есть пользователи, публикующие статьи, и мне нужно показать список статей и отобразить пользователей, которые их опубликовали.

В моем нынешнем методе предрассудков это примерно так:

$result = mysql_getresult("SELECT users.*, articles.* 
                          FROM users JOIN articles ON users.id = articles.user_id
                          WHERE 1");
while($row = mysql_getrow($result)) {
    display_username($row);
    display_articletitle($row);
}

Теперь я хочу сделать это ОО метод

class User {
    protected $data;

    public function loadUserData($id) { $this->data = mysql_readstuff() }
    public function displayUserName() { echo $this->data['name'] }
}


class Article {
    protected $data;

    public function loadArticleData($id) { $this->data = mysql_readstuff() }
    public function displayArticleTitle() { echo $this->data['title'] }
}

проблемы с ОО:

1.) Эти классы имеют свои собственные методы для загрузки своих собственныхdata (и многие другие методы), поэтому быстрый запрос mysql для одновременного получения всех данных с помощью JOIN здесь не работает.Загрузка их собственных данных отлично подходит для многих других методов (например, аутентификации).

2.) Я хочу разделить презентацию (используя шаблон savant3), так где я должен разместить методы отображения?Мне нужно будет отобразить множество вещей (задания, комментарии и т. Д.), И я не думаю, что создание метода для каждого из них в шаблоне - это хорошая идея.

Пример приведен для пользователей и статей, ноу меня будет пользователь + комментарий, пользователь + работа + требования.

Я думал о том, чтобы сделать методы отображения статичными и позволить им принимать параметр, но тогда он ничем не отличается от процедурного метода.Или создайте метод setData ($ row), который установит $ data в качестве полученного параметра.

Возможно, существует общее решение этой проблемы.

Любой совет приветствуется.

Спасибо, Skaccer

Ответы [ 2 ]

1 голос
/ 26 мая 2011

В классе Article не должно быть метода загрузки или метода отображения.

Мой совет - создать табличный шлюз :

Class ArticleGateway {

    getArticles(){} // returns an array of article objects
    getArticlesByAuthor( Author $author ) {}

}

$articleGateway = new ArticleGateway() {}
$articles = $articleGateway->getArticles();

Сейчас$articles содержит массив объектов Article.Вы можете перебирать его в своем представлении и отображать статьи.

0 голосов
/ 01 июля 2012

Точно так же, как @galen сказал,

Не позволяйте вашим методам класса распечатывать ваши данные, пусть они возвращают массив данных, затем вы обрабатываете их так, как вам нужно для их просмотра:

Я испытываю это при разработке своего приложения. я могу использовать свои методы для загрузки данных приложения для Android, а также веб-приложения

...