我正在尝试用PHP学习OOP。我有一个杂志的网站,我创建了一个名为杂志的类,有一些属性。在加载页面时,应加载封面图像或特定文章,第二种变体是用户从两个选择元素中选择一年和一个问题。第二个选择元素取决于第一个 - 并非所有年份都有相同数量的问题。因此,第二个选择元素的正确数量选项也应该由PHP代码生成(我不想仅使用JavaScript)。 这是基本代码:
class Magazine {
public $contents;
public $cover;
public $currentArticle;
public function __construct($year,$issue) {
$this->contents = ...;
...
}
}
$magazine = new Magazine(...);
现在的问题是:我应该在哪里创建选择元素? 1)在自己的一类? 2)在杂志课上,可能通过辅助方法? 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();
过度破坏?
或者我可以通过杂志课传递选择元素,但这似乎毫无意义,因为他们并不属于那里(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元素实际上不是Magazine(对象)的一个实例的属性。
方法3 - 欠杀?
答案 0 :(得分: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
以生成select元素。当用户选择一年时,您对一个公开的PHP Web服务进行AJAX调用,该服务返回您的第二个选择,并将year参数作为AJAX数据。