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


What happen if you don't call parent constructor explicitly in PHP?

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

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

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

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

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

<?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.这就是本案的后果。

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

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

这完全取决于您延长父级的原因。是否需要需要父级初始化的方法?如果是,请调用其构造函数。你能在扩展它之后注入所需的某些特定依赖项,还是需要像常量这样的简单东西?那么你可能不需要。

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

通常,始终向父构造函数添加调用是一个不错的决定,即使那里没有发生任何事情(将来可能会更改)。省略此调用的唯一原因是当您需要重写在构造函数中执行的操作时。这是一个比Java更大的灵活性的功能,例如在Java中,调用父构造函数是强制性的。

php手册用非常简单的术语解释了它

注意:如果子类,则不隐式调用父构造函数定义构造函数。为了运行父构造函数,调用 子构造函数中的parent::__construct()是必需的。如果子项未定义构造函数,则它可能继承自父类就像普通类方法一样(如果未声明作为私人)。

https://www.php.net/manual/en/language.oop5.decon.php