2013-03-07 84 views
2

我正在写一个新的预订系统,就像我以前写过的那样,现在已经有几年了,看起来以次充好了。我想写一个非常灵活和便携的书,我想要使用类。我需要了解课程

我是新来的类和OOP的PHP语言,我以前写过一个类,并且进展顺利。不过,我现在正在为此感到困惑。这是我到目前为止:

class Order 
{ 
    protected $require_gender = false; 
    protected $require_age = false; 
    protected $require_names = false; 
    protected $require_address = false; 
    protected $require_contact = false; 
    protected $require_dates = false; 
    protected $require_additional = false; 

    function __construct() 
    { 
     foreach(func_get_args() as $arg) 
     { 
      switch($arg) 
      { 
       case "names": 
       case "name": $this->require_names = true; break; 
       case "age": $this->require_age = true; break; 
       case "mf": 
       case "gender": $this->require_gender = true; break; 
       case "address": $this->require_address = true; break; 
       case "contact": $this->require_contact = true; break; 
       case "date": 
       case "dates": $this->require_dates = true; break; 
       case "additional": $this->require_additional = true; break; 
      } 
     } 
    } 
} 
class Person extends Order 
{ 
    private $gender; 
    private $age; 
    private $names = array('first' => "", 'last' => "", 'full' => ""); 
    private $address = array( '1' => "", 
        '2' => "", 
        '3' => "", 
        '4' => "", 
        'Postcode' => "", 
        'Country' => ""); 
    private $contact = array('telephone' => "", 'email' => ""); 
    private $dates = array(); 
    private $additional; 
    private $active;  

    function setGender($var)  {$this->gender = $var;} 
    function setAge($var)  {$this->age = $var;} 
    function setNames($var)   {$this->names = $var;} 
    function setAddress($var)  {$this->address = $var;} 
    function setContact($var)  {$this->contact = $var;} 
    function setDates($var)   {$this->dates = $var;} 
    function setAdditional($var) {$this->additional = $var;} 
    function setActive($var)  {$this->actrive = $var;} 
} 

到目前为止,我猜,这么好。但现在我很困惑。因为我认为所谓的“超类”或父母将是客户的订单。这就是他们正在做的事情,他们正在订购门票。然后,他们需要根据需要添加尽可能多的人。

我也希望(为了使它便于携带)能够设置需求,对于每个预订系统,这是因为需求需要改变。不是每个人都想知道日期或邮政地址。这不会因而异,而是每次使用此代码。所以我想在逻辑上我会写:

$order = new Order("names","address","dates"); 

$p = new Person(); 

然后,我会说我想用namesaddressdates的要求设立new Order。这样,我认为,人物会作出相应的反应,只允许设置这些东西,并只在被要求时处理这些参数。但后来我发现 - 当我创建new Person()时,它也会自动运行class Orders()!我不希望它做。我希望Orders()成为霸主,它规定了所有的要求,并且通常管理整个订单,而人只是在订单中成为一个人。

我不知道我的问题是因为我使用extend而不是implements或类似的东西,但有人可以解释我应该改变或下一步做什么吗?我渴望学习。

+2

一个人不是一个订单。 – Gordon 2013-03-07 22:19:13

回答

2

如果您不希望父类的构造函数在子对象的实例化上运行,则需要为子类添加构造函数。这可能是一个空函数:

Person

function __construct() 
{ 
    // uncomment the next line should you want to call the parent constructor 
    // parent::__construct(); 
} 
+2

尽管OOP POV的代码有其他所有的错误,但这可能是正确的答案。 – Gordon 2013-03-07 22:21:28

+0

@Gordon老实说,我没有经历过所有的代码,我专注于最后一段中的问题描述... – jeroen 2013-03-07 22:22:22

+0

@Gordon如果你看到问题让我知道!我说我在这里学习。 – Chud37 2013-03-07 22:22:34

0

你的问题是你使用的方式继承,即延伸。一个人通常说,如果这些类具有“是 - 一种”关系,继承就很好用。对于两个A和B类,如果逻辑上说“B是A的种类”,让B扩展A是可以的。

// jk

+0

哦,对,这实际上是有道理的。在这种情况下,人不是命令。但它是命令的一部分 - 所以我怎么能连接这两个? – Chud37 2013-03-07 22:21:47

+0

我会使类叫做交易和两类扩展交易称为人和票。有各种各样的事务,所以如果你愿意的话,将扩展器封装在一个包装类中是有意义的。 – 2013-03-07 22:24:18

+0

@ Chud37:将一个arg添加到Order构造函数,在该构造函数中传递应连接到此订单的人员。 – 2013-03-07 22:24:35