Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果你不';在PHP中不显式调用父构造函数?_Php - Fatal编程技术网

如果你不';在PHP中不显式调用父构造函数?

如果你不';在PHP中不显式调用父构造函数?,php,Php,我想知道为什么我们必须在PHP中显式调用父构造函数?如果我们忘记调用派生类中的父构造函数,会发生什么 我认为派生类将无法访问其父类的成员属性或方法,但在我尝试不调用父构造函数之后,子类似乎仍然可以访问其父public/protected成员 那么我们必须显式地调用它的父构造函数吗?如果我们忘记这样做,会有什么后果 提前谢谢。任何类型的帮助都将不胜感激:)结果实际上取决于父构造函数中发生的情况。即使未调用父构造函数,所有公共和受保护的成员属性和方法都可用,这是正确的。但是继承的类成员的值可能会在父

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

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

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


提前谢谢。任何类型的帮助都将不胜感激:)

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


通常,总是向父构造函数添加一个调用是一个好的决定,即使那里没有发生任何事情(将来可能会发生变化)。忽略此调用的唯一原因是当您需要重写在构造函数中执行的操作时。这是一个比Java更具灵活性的特性,Java中必须调用父构造函数。

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

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


这完全取决于您扩展父级的原因。您是否需要需要父级进行初始化的方法?如果是,则调用其构造函数。您可以在扩展它之后注入某些特定的依赖项,或者需要一些简单的东西,比如常量吗?那么您可能不需要这样做。

这取决于您的代码。在最简单的情况下,若你们不调用父构造函数,什么也不会发生,但若你们的父构造函数为父类做了一些初始化,那个么所有这些都被忽略了。考虑和玩这个:

<?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();
查看您的手册