要获取一些默认选项,可以使用以下类:
class settings {
function __construct() {
$this->companyName = "Company x"; /* retrieving information from the database */
}
function getCompanyName() { return $this->companyName; }
}
当然,这个课程还有其他重要功能,但为了简化这个问题;这个类从MySQL数据库中获取设置。
现在,还有另一个发送一些邮件的课程。
class mailing extends settings {
function __construct() { /* Default options for mailing */ }
function sendMail() {
echo "Send mail to ".$this-> getCompanyName();
}
}
我想从类settings
获取设置,但不在此类中调用parent::__construct()
,因为已经从设置类中的数据库中检索了信息。我将系统称为:
$settings = new settings();
$mailing = new mailing();
$mailing->sendMail();
不幸的是,我没有得到公司名称。
答案 0 :(得分:2)
从概念上讲,mailing
是settings
的一个实例,我觉得很奇怪。
我认为这更有意义:
$settings = new Settings();
$mailer = new Mailer($settings);
$mailer->sendMail();
然后,您可以Mailer
复制Settings
课程中的所有值,也可以将Settings
课程作为您的值的商店:
class Mailer {
public function __construct(Settings $settings) {
$this->companyName = $settings->get("companyName");
}
public function sendMail() {
echo "Send mail to: " . $this->companyName;
}
}
或
class Mailer {
public function __construct(Settings $settings) {
$this->settings = $settings;
}
public function sendMail() {
echo "Send mail to: " . $this->settings->get("companyName");
}
}
此方法允许您在Mailer
的构造函数中进行一些验证,以检查它是否已收到所有Settings
(通过$settings->has("X")
)。
答案 1 :(得分:0)
您必须调用parent::_construct()
,否则将不会运行settings
类的构造函数中的语句。
mailing
类的构造函数应如下所示:
function __construct() {
parent::_construct(); // General settings set by settings constructor
// Mailing specific settings like already done in the current constructor
}
答案 2 :(得分:0)
在您的示例中,$settings
和$mailing
是不同的实例,因此它们之间也存在关系。如果您不想调用父构造,您可以执行以下操作:
$settings = new settings();
$mailing = new mailing();
$mailing->companyName= $settings->companyName;
$mailing->sendMail();
答案 3 :(得分:0)
您可以在构造函数和构造函数参数中使用if
语句执行一个简单的技巧,说明脚本是否应该从数据库加载数据,或者数据是否已存在且不需要。
答案 4 :(得分:0)
如果你想这样做,那么你必须找到一种方法来设置邮件类的公司名称,例如
class mailing extends settings {
function __construct($company_name) { $this->companyName = $company_name; }
function sendMail() {
echo "Send mail to ".$this->companyName;
}
}
这段代码应该是
$settings = new settings();
$mailing = new mailing($settings->getCompanyName ());
$mailing->sendMail();
答案 5 :(得分:0)
你是否在邮件结构中没有做任何事情,你甚至可以错过它。否则,您必须先调用父构造,然后编写代码。
示例:
function __construct() {
parent::_construct();
// some code here
}
答案 6 :(得分:0)
扩展课程并不能帮助你实现你想要做的事情,我不确定这是否是最好的设计。但是,如果您想拥有一个包含所有设置的对象,然后拥有一个使用此选项的邮件类,您应该通过添加属性"设置"到邮件类:
//你的设置类:
class settings {
function __construct() {
$this->companyName = "Company x"; /* retrieving information from the database */
}
function getCompanyName() { return $this->companyName; }
}
//新的邮件类,构造函数采用设置对象
class mailing {
private $settings;
function __construct(settings $settings) {
$this->settings=$settings;
}
function sendMail() {
echo "Send mail to ".$this->settings->getCompanyName();
}
}
//从DB
初始化设置$settings = new settings();
//创建具有初始化设置的新类
$mailing = new mailing($settings);
$mailing->sendMail();
这将输出"发送邮件到公司x"并且您可以在可能需要的地方重用设置对象。