7

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

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

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

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

4

3 回答 3

6

这取决于您的代码。如果你不调用父构造函数,最简单的事情是什么都不会发生,但是如果你的父构造函数为父类做了一些初始化,那么所有这些都被遗漏了。考虑并玩这个:

<?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 Yparent call parent::__construct($a);,你会得到 2。这就是这种情况下的结果。

于 2012-06-07T05:43:32.447 回答
3

因为如果子类定义了构造函数,则不会隐式调用父构造函数。如果子类假设父类已经初始化并做了一些工作,则需要确保进入父类构造函数。

例如,您可以扩展一个您不希望输入父构造函数的类。该行为只是允许设计中的更多灵活性。在大多数情况下,您可能希望调用父构造函数。

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

于 2012-06-07T05:43:12.657 回答
1

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

总是添加对父构造函数的调用通常是一个不错的决定,即使那里没有发生任何事情(将来可能会改变)。省略此调用的唯一原因是当您需要覆盖在构造函数中执行的操作时。这是一个比你在Java中增加更多灵活性的特性,在Java中调用父构造函数是强制性的。

于 2012-06-07T05:41:49.837 回答