【问题标题】:Call parent constructor automatically after children PHP在子 PHP 之后自动调用父构造函数
【发布时间】:2013-05-04 09:13:06
【问题描述】:

我尝试使用父类的名称,例如构造函数,并且部分为我工作。

第一次调用

“DarthVader 方法”

类似于构造函数,但从不调用

“LukeSkywalker 构造函数”..

有人知道怎么做吗?

示例:

达斯.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";
    }
}

卢克.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();
    }
}

预期结果:

  • 欧比旺从未告诉过你父亲的遭遇。

  • 他告诉我的已经够多了!他告诉我你杀了他!

  • 没有。我是你爸爸

我真的很想这样,自动。

【问题讨论】:

  • 嘿现在 - 剧透! :D
  • 我找到了“卢克天行者构造函数”没有运行的原因。简单地。是“__constructor”,而不是“__constructor”,这支持@Marc B 的理论。谢谢大家

标签: php oop inheritance constructor parent-child


【解决方案1】:

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

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

【讨论】:

    【解决方案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();

    【讨论】:

    • 除非默认情况下它们会被自动调用,除非它们是在孩子中定义的。
    • 这个答案应该被否决,因为它的信息是错误的“默认情况下,父构造函数永远不会自动调用(除非在子类中定义)。即使在Java中,你也必须调用它们明确的,它必须是第一个陈述。”首先,在 PHP 中,如果子级没有定义构造方法,则默认调用父级构造方法。其次,在Java中,如果没有显式调用超类的构造函数,java会自动调用超类的无参构造函数,或者如果这样的构造函数不存在则抛出错误。
    • @guaranteed.site 这个答案很旧,我同意,这有点误导。打算删除它。
    猜你喜欢
    • 2011-03-06
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2015-12-03
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多