实例化派生类时是否隐式调用抽象类构造函数?

发布于 2024-08-23 05:14:20 字数 435 浏览 4 评论 0原文

举个例子:

abstract class Base {
    function __construct() {
        echo 'Base __construct<br/>';
    }
}

class Child extends Base {
    function __construct() {
        echo 'Child __construct<br/>';
    }
}

$c = new Child();   

我有 C# 背景,我期望输出是

基础 __construct
子 __construct

然而,实际输出只是

子__construct

Take this example:

abstract class Base {
    function __construct() {
        echo 'Base __construct<br/>';
    }
}

class Child extends Base {
    function __construct() {
        echo 'Child __construct<br/>';
    }
}

$c = new Child();   

Coming from a C# background, I expect the output to be

Base __construct
Child __construct

However, the actual output is just

Child __construct

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

み青杉依旧 2024-08-30 05:14:20

不,如果子类定义了构造函数,则不会调用父类的构造函数。

从子类的构造函数中,您必须调用父类的构造函数:

parent::__construct();

如果需要,向其传递参数。

通常,您将在子类的构造函数的开头、任何特定代码之前执行此操作;这意味着,就您而言,您将拥有:

class Child extends Base {
    function __construct() {
        parent::__construct();
        echo 'Child __construct<br/>';
    }
}

并且,作为参考,您可以查看 PHP 手册的此页面:构造函数和析构函数 - 它指出(引用)

注意:如果子类存在,则不会隐式调用父构造函数
定义一个构造函数。
为了
运行父构造函数,调用
内的 parent::__construct()
需要子构造函数。

No, the constructor of the parent class is not called if the child class defines a constructor.

From the constructor of your child class, you have to call the constructor of the parent's class :

parent::__construct();

Passing it parameters, if needed.

Generally, you'll do so at the beginning of the constructor of the child class, before any specific code ; which means, in your case, you'd have :

class Child extends Base {
    function __construct() {
        parent::__construct();
        echo 'Child __construct<br/>';
    }
}

And, for reference, you can take a look at this page of the PHP manual : Constructors and Destructors -- it states (quoting) :

Note: Parent constructors are not called implicitly if the child class
defines a constructor.
In order to
run a parent constructor, a call to
parent::__construct() within the
child constructor is required.

若水般的淡然安静女子 2024-08-30 05:14:20

好吧,我刚刚在文档中找到了这个:

注意:父构造函数不是
如果子类隐式调用
定义一个构造函数。为了运行
父构造函数,调用
子级中的parent::__construct()
需要构造函数。

Well, I just found this in the docs:

Note: Parent constructors are not
called implicitly if the child class
defines a constructor. In order to run
a parent constructor, a call to
parent::__construct() within the child
constructor is required.

潜移默化 2024-08-30 05:14:20

如果您需要与 C# 相同的行为,即父构造函数始终在子构造函数之前执行,您可以为子类创建一个假构造函数类,并将其声明为抽象父类中的抽象函数。

例如

abstract class Test{
  abstract public function __childconstruct();
  public function __construct(){
    echo "SOME CODE".PHP_EOL;
    $this->__childconstruct();
  }
}

class TestExtended extends Test{
  public function __childconstruct(){
    echo "SOME OTHER CODE FROM EXTENDED CLASS".PHP_EOL;
  }
}

$a = new TestExtended();

/* SOME CODE
   SOME OTHER CODE FROM EXTENDED CLASS */

If you need the same behaviour as C#, that is the parent constructor gets always executed before child constructor, you could create a fake constructor class for your child classes and declare it as an abstract function in your abstract parent class.

E.g.

abstract class Test{
  abstract public function __childconstruct();
  public function __construct(){
    echo "SOME CODE".PHP_EOL;
    $this->__childconstruct();
  }
}

class TestExtended extends Test{
  public function __childconstruct(){
    echo "SOME OTHER CODE FROM EXTENDED CLASS".PHP_EOL;
  }
}

$a = new TestExtended();

/* SOME CODE
   SOME OTHER CODE FROM EXTENDED CLASS */
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文