我想知道是否可以在孩子的__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;
}
}
有意义吗?
谢谢! 马特穆勒
答案 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的答案,我想他是对的(我从来没有尝试过编写扩展来做到这一点)。尽管如此,实施它仍会打破开发人员的期望,同时更难以实际看到代码来解释发生了什么。