自动调用父类构造函数在子类 PHP 中

13

我尝试使用父类的名称作为构造函数,它对我部分地起作用。

首先调用

"DarthVader方法"

就像构造函数一样,但从未调用

"LukeSkywalker构造函数"。

有人知道怎么做吗?

例子:

Darth.php

class DarthVader{
    public function DarthVader(){
        echo "-- Obi-Wan never told you what happened to your father.\n";
    }
    public function reponse(){
        echo "-- No. I am your father\n";
    }
}

Luke.php

include("Darth.php")

class LukeSkywalker extends DarthVader{
 public function __constructor(){
        echo "- He told me enough! He told me you killed him!\n"
        $this->response();
    }
}

预期结果:

  • 欧比旺没有告诉你有关你父亲的事情。

  • 他告诉了我足够多!他告诉我是你杀了他!

  • 不。我是你的父亲。

我真的很希望它可以自动完成。


2
嘿,现在不要剧透!:D - andrewsi
我找到了"卢克天行者构造函数"无法运行的原因。很简单,应该是"__construc"而不是"__constructor"。这证实了@Marc B的理论。谢谢大家。 - iLevi
2个回答

33
根据文档:http://php.net/manual/zh/language.oop5.decon.php

注意:如果子类定义了构造函数,则不会自动隐式调用父类构造函数。为了运行父类构造函数,需要在子类构造函数中调用 parent::__construct()。如果子类没有定义构造函数,则可以像普通类方法一样继承自父类(前提是该方法没有声明为 private)。


2

默认情况下,父类构造函数不会自动调用(除非在子类中定义)。即使在Java中,您也必须显式调用它们,并且它必须是第一个语句。

请注意,在PHP中,构造函数的名称为 __construct ,它被认为是一个魔术方法,因为它在创建对象时被调用。

class LukeSkywalker extends DarthVader{
  public function __construct(){ //See the name of magic  method. It is __construct
    parent::__construct(); //Call parents constructor
    echo "- He told me enough! He told me you killed him!\n"
    $this->response();
  }
}

使用上述代码,每次执行以下操作时,您将获得所需的结果:

new LukeSkywalker();


(注:此处为 IT 技术相关内容,涉及代码编写语言)

14
除非在子级中定义,否则默认情况下它们会自动调用,这是它们的标准设置。 - Frug
这个答案应该被点踩,因为它提供的信息是错误的。首先,在PHP中,如果子类没有定义构造函数方法,则默认情况下会调用父类构造函数。其次,在Java中,如果没有显式调用超类构造函数,则Java会自动调用超类的无参构造函数,或者如果不存在这样的构造函数,则会抛出错误。 - guaranteed.site
@guaranteed.site 这个回答已经过时了,我同意,它有点误导性。我将把它删除。 - sybear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接