在PHP中的子构造函数之前调用父构造函数

时间:2010-06-20 16:01:13

标签: php inheritance oop

我想知道是否可以在孩子的__construct()之前调用父__construct(),并在PHP中继承。

示例:

class Tag {
     __construct() {
         // Called first.
     }
}

class Form extends Tag {
     __construct() {
         // Called second.
     }
} 

new Form();

理想情况下,我可以在他们之间做点什么。如果这是不可能的,有没有替代方案,这将允许我这样做?

我想这样做的原因是能够加载一组特定于表格可以在调用__construct()时使用的标签的默认设置。

编辑:抱歉忘了添加这个..我宁愿不从子类调用父类。这只是因为它将一些私有数据(对于父级)公开给孩子,当你将其作为参数传递时

这就是我想要做的事情:

$tag = new Tag($privateInfo, $publicInfo);
$tag->extend(new Form()); // Ideal function, prob doesn't work with inheritance.

Tag.php

class Tag {
     private $privateInfo;
     public $publicInfo;
     __construct($private, $public) {
         $this->privateInfo = $private;
         $this->publicInfo = $public;
     }
} 

form.php的

class Form extends Tag {

     __construct() {
         echo $this->publicInfo;
     }
} 

有意义吗?

谢谢! 马特穆勒

4 个答案:

答案 0 :(得分:46)

只需在孩子中调用parent :: __ construct。

class Form extends Tag
{
    function __construct()
    {
        parent::__construct();
        // Called second.
    }
}

答案 1 :(得分:3)

是的,只需在你的构造中调用parent::__construct()

答案 2 :(得分:3)

是的,但只是在内部(即通过编写PHP扩展名),所以如果我是你,我会决定调用parent::__construct()。请参阅PHP wiki上的this section

抱歉,PHP不是Java。我认为不需要(隐式地或明确地)要调用的超级构造函数是一个非常糟糕的设计决策。

答案 3 :(得分:1)

从声音中你可能想重新考虑你的设计,这样你就不需要在构造函数中传递参数了。如果你不认为可以做到这一点,那就问一个问题,你可能会对一些建议感到惊讶。

子类可以覆盖父构造函数而不需要调用它。我建议在父类中使用最终方法。这样每个人都知道你不希望这被覆盖,任何继承的类(正确地)都有权在构造函数中做任何想做的事。

class Father {
    private $_privateData;
    final function setPrivateData($privateData) {
        $this->_privateData = $privateData;
    }
}

另一个,不推荐,更“重新发明轮子”,解决方案是在父类中定义一个函数,比如_construct(),它在自己的构造中被调用。它不是很清楚,不使用语言特性/结构,并且非常特定于单个应用程序。

要记住的最后一件事是:您无法真正隐藏子类中的信息。使用Reflection,serialize,var_dump,var_export以及php语言中的所有其他方便的API,如果有代码不应该对数据做任何事情,那么除了不存储它之外你不能做太多的事情。有些库可以帮助创建沙箱,但是很难将对象自身沙箱化。

编辑:不知怎的,我错过了Artefacto的答案,我想他是对的(我从来没有尝试过编写扩展来做到这一点)。尽管如此,实施它仍会打破开发人员的期望,同时更难以实际看到代码来解释发生了什么。

相关问题