【问题标题】:OOP design - multiple classes, helper method or procedural code?OOP 设计 - 多个类、辅助方法或过程代码?
【发布时间】:2015-04-10 13:49:54
【问题描述】:

我正在尝试使用 PHP 学习 OOP。我有一个杂志网站,我创建了一个名为 Magazine 的类,其中包含一些属性。加载页面时,应加载封面图片或特定文章,第二个变体是用户从两个选择元素中选择了一年和一个问题。第二个选择元素取决于第一个 - 并非所有年份都有相同数量的问题。所以第二个选择元素的正确数量的选项也应该由 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();

矫枉过正?

或者我可以通过 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 有同样的问题——如果对象应该反映现实世界,则选择元素并不是杂志(对象)的(实例)的真正属性。

方法 3 - 杀戮?

【问题讨论】:

  • 我认为另一种更专注于 JS 的解决方案是,以 JSON 格式传递每年都有特定问题的杂志地图,然后使用 JS/jQuery 解析它们客户端。
  • 感谢您的意见,但正如我所说,我不想单独依赖 JS。此外,它不会教我从 OOP 的角度思考,这是问题的主要目的之一。

标签: php class oop constructor


【解决方案1】:

您可能想做类似的事情(不确定语法,我不太了解 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 来生成选择元素。当用户选择年份时,您对公开的 PHP Web 服务进行 AJAX 调用,该服务返回您的第二个选择,年份参数作为 AJAX 数据。

【讨论】:

  • 谢谢。不过,我不完全确定我理解你的建议,但我会继续努力。 :) 里面有几件事我需要阅读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
相关资源
最近更新 更多