2013-03-07 2 views
2

Я пишу новую систему бронирования, увидев, как я написал ранее, теперь лет лет и выглядит дрянной. Я хочу написать тот, который очень гибкий и портативный, и я хочу использовать классы.Мне нужно понять классы

Я новичок в классах и ООП на языке 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(); 

Тогда, я бы создание new Order с требованиями, которые я хочу использовать names, address и dates. Таким образом, я решил, что объект человека будет реагировать соответствующим образом и только позволит устанавливать эти вещи и только обрабатывать эти параметры, когда их просят. Но потом я узнаю, что когда я создаю new Person(), он автоматически запускает class Orders()! Который я не хочу этого делать. Я хочу, чтобы Orders() был повелителем, который устанавливает все требования и, как правило, управляет всем порядком, а человек просто должен быть человеком в этом порядке.

Я не уверен, что моя проблема в том, что я использую extend вместо implements или что-то в этом роде, но может ли кто-нибудь объяснить, что я должен менять или делать дальше, пожалуйста? Я очень хочу учиться.

+2

Человек не является орденом. – Gordon

ответ

2

Если вы не хотите, чтобы конструктор родительского класса запускался при создании экземпляра дочернего объекта, вам нужно добавить конструктор для дочернего класса. Это может быть пустой функцией:

В Person:

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

, несмотря на все, что неправильно с кодом из ООП-POV, это, вероятно, правильный ответ. – Gordon

+0

@ Gordon Честно говоря, я не прошел весь код, я сосредоточился на описании проблемы в последнем абзаце ... – jeroen

+0

@ Gordon, если вы видите проблемы, дайте мне знать! Я сказал, что я здесь, чтобы учиться. – Chud37

0

Ваша проблема в том, как вы используете наследование, то есть расширяется. Обычно говорят, что наследование полезно использовать, если классы имеют отношения «is-a». Для двух классов A и B было бы нормально, если B продолжит A, если логично сказать: «B - это своего рода A».

// jk

+0

О, хорошо, это на самом деле имеет смысл. В этом случае человек не является Ордером. Но это часть заказа - так как я могу связать их? – Chud37

+0

Я бы сделал класс, называемый транзакцией, и два класса, расширяющие транзакцию под названием person и ticket. Существуют все виды транзакций, поэтому имеет смысл обернуть расширители в своего рода класс-оболочку, если хотите. –

+0

@ Chud37: Добавьте аргумент в конструктор Order, в котором вы передаете человека, который должен быть подключен к этому заказу. –

Смежные вопросы