类和构造函数

时间:2014-03-31 12:53:04

标签: php oop

要获取一些默认选项,可以使用以下类:

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();

不幸的是,我没有得到公司名称。

7 个答案:

答案 0 :(得分:2)

从概念上讲,mailingsettings的一个实例,我觉得很奇怪。

我认为这更有意义:

$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"并且您可以在可能需要的地方重用设置对象。