OOP设计 - 多个类,辅助方法或程序代码?

时间:2015-02-10 13:45:07

标签: php class oop constructor

我正在尝试用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 - 欠杀?

1 个答案:

答案 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数据。