我需要了解课程

时间:2013-03-07 22:12:14

标签: php oop

我正在编写一个新的预订系统,我之前写过的这个系统现在已经很久了,看起来很糟糕。我想写一个非常灵活和可移植的,我想要使用类。

我是php语言中的类和OOP的新手,我之前写了一个类,并且进展顺利。但是我现在对此感到困惑。这就是我到目前为止所做的:

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;}
}

到目前为止我猜,太好了。但现在我很困惑。因为我认为所谓的'超类'或父母,将是客户订单。正如他们正在做的那样,他们正在订票。然后,他们需要添加尽可能多的人。

我还想(为了使其便携)能够设置要求,对于每个预订系统,这被用作需要更改的要求。并非所有人都想知道日期,例如邮寄地址。这不会因 person 而异,但每次使用此代码时都会有所不同。所以我想从逻辑上说我会写:

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

$p = new Person();

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

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

2 个答案:

答案 0 :(得分:2)

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

Person

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

答案 1 :(得分:0)

您的问题是您使用继承的方式,即扩展。人们通常会说,如果类具有“is-a”关系,那么继承就很好用。对于A和B两个类,如果说“B是某种A”是合乎逻辑的,那么让B扩展A是可以的。

// JK