【问题标题】:If I don't define a constructor for a subclass, can I use the constructor of the superclass directly?如果不给子类定义构造函数,可以直接使用超类的构造函数吗?
【发布时间】:2012-01-02 19:22:49
【问题描述】:

构造函数是继承的还是属于定义它们的类?我只见过调用超类构造函数的子类构造函数的例子。这是我当前的代码,它可以提供一些关于正在发生的事情的提示。 (我会根据你的回复改代码。如果我可以使用超类的构造函数,我不会为每个子类定义一个构造函数,并从每个子类中调用超类的构造函数。

abstract class view
{
 public $vieverid;

 function __construct($viewerid) {
  $this->viewer = $viewerid;
 }
}
class viewactor extends view{

 function __construct($viewerid) {
  $this->viewerid = $viewerid;
 }

【问题讨论】:

    标签: php oop inheritance constructor


    【解决方案1】:

    parent::__construct(params); 用于调用超类构造函数

    PHP4

    PHP 不会自动调用基类的构造函数 派生类的构造函数。传播是你的责任 在适当的情况下调用上游的构造函数。

    PHP5

    如果定义了新的构造函数,PHP 不会调用基类的构造函数。 如果为派生类定义构造函数 传播是你的责任 在适当的情况下调用上游的构造函数。 父级::__construct(params)

    构造函数

    abstract class view
    {
     public $vieverid;
    
     function __construct($viewerid) {
      $this->vieverid= $viewerid;
     }
    }
    
    class viewactor extends view{
    
     function __construct($viewerid) {
       parent::__construct($viewerid);
       // Extra code if you want
     }
    }
    
    class viewactor_construct extends view{
        // Works in PHP5
    }
    

    【讨论】:

    • 在这个线程上,moe说“根据我的理解,如果定义了子构造函数,PHP不会自动调用父构造函数。否则它会。”你同意吗?
    • 我同意。如果不定义构造函数,则在 PHP5 中会调用父构造函数
    【解决方案2】:

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

    See here

    【讨论】:

    • 他们为什么认为所有示例都有这样的代码?类 viewactor 扩展 view{ function __construct($viewerid) { parent::__construct($viewerid); }
    【解决方案3】:

    据我了解,如果定义了子构造函数,PHP 不会自动调用父构造函数。否则会。

    在子构造函数中你必须手动调用父构造函数。

    abstract class view
    {
     public $vieverid;
    
     function __construct($viewerid) {
      $this->viewer = $viewerid;
     }
    }
    class viewactor extends view{
    
     function __construct($viewerid) {
      parent::__construct($viewerid); // manual call
      // do your stuff here...
      $this->viewerid = $viewerid;
     }
    

    【讨论】:

      猜你喜欢
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 2020-10-31
      • 2021-07-24
      • 2021-09-19
      相关资源
      最近更新 更多