繁体   English   中英

在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM