![](/img/trans.png)
[英]Is it mandatory to call parent::__construct from the constructor of child class in PHP?
[英]Call parent constructor before child constructor in PHP
我想知道是否有可能在PHP的继承之前调用子__construct()之前的父__construct()。
例:
class Tag {
__construct() {
// Called first.
}
}
class Form extends Tag {
__construct() {
// Called second.
}
}
new Form();
理想情况下,我可以在它们之间做点什么。 如果这是不可能的,有没有替代方案,这将允许我这样做?
我想这样做的原因是能够加载一组特定于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;
}
}
说得通?
谢谢! 马特穆勒
只需在子节点中调用parent :: __ construct即可。
class Form extends Tag
{
function __construct()
{
parent::__construct();
// Called second.
}
}
是的只是在你的构造中调用parent::__construct()
是的,但只是在内部(即通过编写PHP扩展),所以如果我是你,我会选择调用parent::__construct()
。 请参阅PHP wiki上的此部分 。
对不起,PHP不是Java。 我认为不需要(隐式地或明确地)要调用的超级构造函数是一个非常糟糕的设计决策。
从它的声音中你可能想重新考虑你的设计,这样你就不需要在构造函数中传递参数。 如果您认为不能这样做,请将其作为一个问题,您可能会对一些建议感到惊讶。
子类可以覆盖父构造函数而不需要调用它。 我建议在父类中使用最终方法。 这样每个人都知道你不希望这被覆盖,任何继承的类(正确地)都有权在构造函数中做任何想做的事情。
class Father {
private $_privateData;
final function setPrivateData($privateData) {
$this->_privateData = $privateData;
}
}
另一个,不推荐,更“重新发明轮子”,解决方案是在父类中定义一个函数,比如_construct(),它在自己的构造中调用。 它不是很清楚,不使用语言特性/结构,并且非常特定于单个应用程序。
最后要记住的一点是:你无法真正隐藏子类的信息。 使用Reflection,serialize,var_dump,var_export以及php语言中的所有其他方便的API,如果有代码不应该对数据做任何事情,那么除了不存储它之外你不能做太多的事情。 有一些库可以帮助创建沙箱,但是它很难将一个对象自己沙箱化。
编辑:不知怎的,我错过了Artefacto的答案,我想他是对的(我从来没有尝试过编写扩展来做到这一点)。 尽管如此,实施它仍会打破开发人员的期望,同时更难以实际看到代码来解释发生了什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.