如果你不在PHP中显式调用父构造函数会发生什么?

时间:2012-06-07 05:31:02

标签: php

我想知道为什么我们必须在PHP中显式调用父构造函数?如果,假设我们忘记在派生类中调用父构造函数会发生什么?

我认为派生类不能访问其父类的成员属性或方法,但在我尝试不调用父构造函数之后,似乎子类仍然可以访问其父公共/受保护成员

那么我们必须显式调用它的父构造函数吗?如果我们忘记这样做会有什么后果?

提前致谢。任何形式的帮助将不胜感激:)

3 个答案:

答案 0 :(得分:5)

这取决于您的代码。在它最简单的情况下,如果你不调用父构造函数,没有任何反应,但如果你的父构造函数为父类初始化做了一些事情,那么所有这一切都被遗漏了。考虑一下,玩这个:

<?php

class X {
    private $_a;

    public function __construct($a) {
        echo 'X::construct ';
        $this->_a = $a;
    }

    public function getA() {
        return $this->_a;
    }
}

class Y extends X {
    private $_b;

    public function __construct($a,$b) {
        echo 'Y::construct ';
        parent::__construct($a);
        $this->_b = $b;
    }

    public function getAB() {
        return $this->_b + $this->getA();
    }
}

$n = new Y(3,2);
echo $n->getAB();

很容易看出,如果你运行它,它打印出5(在其他转储中)。但是,如果您对class Y家长致电parent::__construct($a);发表评论,则会得到2.这就是本案的结果。

答案 1 :(得分:3)

如果子类定义了构造函数,则不会隐式调用父构造函数。如果子类假定父类已初始化并完成某些工作,则需要确保输入父构造函数。

例如,您可以扩展一个您不想要输入父构造函数的类。这种行为只是为了提高设计的灵活性。在大多数情况下,可能想要调用父构造函数。

这一切都取决于为什么你扩展了父母。您是否需要需要父级初始化的方法?如果是,请调用其构造函数。您可以在扩展它之后注入某些特定的依赖项,还是需要像常量这样的简单事物?那你可能不需要。

答案 2 :(得分:1)

后果实际上取决于父构造函数中发生的事情。即使未调用父构造函数,所有公共和受保护的成员属性和方法都可用,这是正确的。但是可以在父构造函数中修改/初始化继承类成员的值 - 您需要决定是否希望这样做。

它通常是一个很好的决定,总是向父构造函数添加一个调用,即使它没有发生任何事情(将来可能会改变)。省略此调用的唯一原因是您需要覆盖构造函数中执行的操作。这是一项功能,可以增加比您拥有的更多的灵活性,例如在Java中,必须调用父构造函数。