2013-03-07 82 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