我正在尝试用PHP学习OOP。我有一个杂志的网站,我创建了一个名为《杂志》的课程,里面有一些属性。当加载页面时,应该加载封面图像或特定文章,第二种变体是用户从两个选择元素中选择一年和一期。第二个选择因素取决于第一个因素——并非所有年份都有相同数量的问题。因此,第二个select元素的正确选项数也应该由PHP代码生成(我不想只使用JavaScript)。这是基本代码:
class Magazine {
public $contents;
public $cover;
public $currentArticle;
public function __construct($year,$issue) {
$this->contents = ...;
...
}
}
$magazine = new Magazine(...);
现在的问题是:我应该在哪里创建select元素?1) 在自己的班级里?2) 在Magazine类中,可能通过helper方法?3) 在我创建类实例的主代码中?
方法一(1a)可能看起来像这样:
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();
过度杀戮?
或者我可以通过Magazine类传递select元素,但这似乎毫无意义,因为它们并不真正属于那里(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有同样的问题——如果对象应该反映真实世界,那么选择元素并不是杂志(对象)的(实例)属性。
第三种方法-杀少?
你可能想做这样的事情(不确定语法,我真的不懂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
来生成select元素。当用户选择一个年份时,您对一个公开的PHP web服务进行AJAX调用,该服务返回您的第二个选择,年份参数作为AJAX数据。