我正在编写一个新的预订系统,我之前写过的这个系统现在已经很久了,看起来很糟糕。我想写一个非常灵活和可移植的,我想要使用类。
我是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
,其中包含我要使用names
,address
和dates
的要求。这样,我认为,person对象会做出相应的反应,只允许设置这些东西,并且只在被要求时才处理这些参数。但后来我发现 - 当我创建new Person()
时,它也会自动运行class Orders()
!我不希望它这样做。我希望Orders()
成为设定所有要求的霸主,并且通常管理整个订单,而人只是该订单中的人。
我不确定我的问题是因为我使用的是extend
而不是implements
或类似的东西,但有人可以解释一下我应该改变或接下来做什么吗?我渴望学习。
答案 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