Я пытаюсь изучить ООП с 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 — недоумение?
Возможно, вы захотите сделать что-то подобное (не уверен насчет синтаксиса, я действительно не знаю 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.
Других решений пока нет …