OOP设计-多个类、辅助方法或过程代码


OOP design - multiple classes, helper method or procedural code?

我正在尝试用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数据。