2015-02-10 46 views
0

我正试图用PHP学习OOP。我有一个杂志的网站,我创建了一个名为杂志与一些属性的类。当加载页面时,应该加载封面图片或特定文章,第二个变体是用户从两个选择元素中选择了一年和一个问题。第二个选择要素依赖于第一个 - 不是所有年份都有相同数量的问题。因此,第二个select元素的正确选项数量也应该由PHP代码生成(我不想仅为此使用JavaScript)。 这里是基本的代码:OOP设计 - 多个类,辅助方法或程序代码?

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 - 如果对象被认为是反映真实世界的,那么选择元素并不真正是杂志(对象)的(实例)的属性。

方法3 - 低估?

+0

我认为针对您的问题的另一个更注重JS的解决方案是将带有特定问题的杂志地图以JSON格式传递给客户端,然后使用JS/jQuery解析它们。 – eriksson 2015-02-10 14:04:22

+0

感谢您的意见,但正如我所说,我不想单靠JS。此外,它不会教我从面向对象的角度来思考,这是问题的主要目的之一。 – linurb 2015-02-11 07:59:21

回答

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到生成选择元素。当用户选择一年时,您将对显示的PHP Web服务进行AJAX调用,该服务将返回第二个选择,并将year参数作为AJAX数据。

+0

谢谢。虽然我不完全确定我理解你的建议,但我会继续努力。 :)有几件事我需要阅读。 – linurb 2015-02-13 10:51:25