ООП дизайн — несколько классов, вспомогательный метод или процедурный код?

Я пытаюсь изучить ООП с PHP. У меня есть веб-сайт для журнала, и я создал класс Magazine с некоторыми свойствами. При загрузке страницы должно быть загружено изображение обложки или конкретная статья, второй вариант, когда пользователь выбрал год, и проблема из двух выбранных элементов. Второй элемент выбора зависит от первого — не все годы имеют одинаковое количество проблем. Поэтому правильное количество опций для второго элемента select также должно генерироваться кодом PHP (я не хочу использовать для этого только JavaScript).
Вот основной код:

class Magazine {
public $contents;
public $cover;
public $currentArticle;

public function __construct($year,$issue) {
$this->contents = ...;
...
}
}

$magazine = new Magazine(...);

А теперь вопрос: где я должен создать выбранные элементы?
1) В своем классе?
2) В классе Magazine, может быть, с помощью вспомогательного метода?
3) В основном коде, где я создаю экземпляры классов?

Метод номер один (1а) может выглядеть примерно так:

class Magazine {
public $contents;
public $cover;
public $currentArticle;

public function __construct($year,$issue) {
$this->contents = ...;
...
}
}

class SelectMagazine {
public $year;
public $issue;

public function __construct($year,$issue) {
$this->year = ...;
...
}
}
$magazine = new Magazine();
$selectMagazine = new SelectMagazine();

Overkill?

Или я мог бы пропустить элемент select через класс Magazine, но это кажется довольно бессмысленным, поскольку они там на самом деле не принадлежат (1b):

class Magazine {
public $contents;
public $cover;
public $currentArticle;

public function __construct($year,$issue) {
$this->contents = ...;
...
$selectMagazine = new SelectMagazine();
$this->year = $selectMagazine->year;
...
}
}

class SelectMagazine {
public $year;
public $issue;

public function __construct($year,$issue) {
$this->year = ...;
...
}
}
$magazine = new Magazine();

Метод номер два имеет ту же проблему, что и 1b — элементы select на самом деле не являются свойствами (экземпляром) Журнала (объекта), если объекты должны отражать реальный мир.

Способ № 3 — недоумение?

0

Решение

Возможно, вы захотите сделать что-то подобное (не уверен насчет синтаксиса, я действительно не знаю PHP :))

<?
interface SelectHelper {
function getSelect()
{

}
}

class YearsSelectHelper extends SelectHelper {

public function __construct() {
self->magazines = Database::getMagazineList(); // or something
}
public function getSelect()
{
$select = '';

// Construct the select with the years
// You probably want to use private functions to construct
// the select element.
...
return $select;
}
}

class IssuesSelectHelper extends SelectHelper {

public function __construct($year) {
self->year = $year;
// Get the magazine corresponding to that year
}

public function getSelect()
{
// Same thing as in the other class
}
}

По вашему мнению, вы воплощаете YearsSelectHelper, а затем позвоните getSelect создать элемент выбора. Когда пользователь выбирает год, вы делаете AJAX-вызов доступной веб-службы PHP, которая возвращает ваш второй выбор с параметром year в качестве данных AJAX.

0

Другие решения

Других решений пока нет …