【问题标题】:How do I access a parent's methods inside a child's constructor in PHP?如何在 PHP 中访问子构造函数中的父方法?
【发布时间】:2013-12-27 23:20:50
【问题描述】:

假设我有class child()class parent()。父级有一个构造函数和一些其他公共方法,而子级除了构造函数之外是空的。

如何在子构造函数中调用父方法,如下所示:

Class Parent {
    public function __construct() {
       // Do stuff (set up a db connection, for example)
    }

    public function run($someArgument) {
       // Manipulation
       return $modifiedArgument;
    }
} 

Class Child extends Parent {
    public function __construct() {
      // Access parent methods here?
    }  
}

假设我想调用parents run() 方法,我是否必须在子构造函数中调用父级的新实例?就这样……

$var = new Parent(); 
$var->run($someArgument);

如果是这样,从类定义 POV 中extends 的意义何在?我可以使用 new 关键字调用另一个类的新实例,无论它是否扩展了“孩子”。

我(可能)错误的理解是,通过使用extends,您可以将父级的类和方法链接到子级。那只是在类定义之外吗?使用extend 是否在类定义中没有效率?

因为用this关键字引用父级的run()方法肯定是行不通的……

【问题讨论】:

  • 但是$this 不是只指子定义吗?我尝试调用$this->__construct(); 作为对子构造函数中父构造函数的引用,PHP 抛出的错误表明它认为手头的对象是子构造函数本身。
  • 带有parent 关键字,很有趣;)

标签: php class oop inheritance


【解决方案1】:

使用parent 作为预定义参考:parent::run()。这将确保您调用父方法。与您可以先调用第一个父构造函数或在子构造函数之后调用相同的方式 - parent::__construct()

Class Child extends Parent {
    public function __construct() {
      parent::__construct();
      // Access parent methods here?
      $some_arg = NULL; // init from constructor argument or somewhere else
      parent::run($some_arg); // explicitly call parent method
      // $this->run($some_arg); // implicitly will call parent if no child override
    }  

}

如果你在子进程中没有实现,你可以调用$this->run($args),它会再次调用父运行方法。

【讨论】:

  • 不仅run() 就够了吗?因为Child 类中没有任何run() 实现
  • 是的,但是如果您在子程序中运行,它将运行它并且问题正是针对父方法的。
  • @AbdullahShoaib 不完全是。想象一下 run() 是一个改变受保护属性值的方法。如果它从 $this 上下文中调用, ($this->run()) 它将改变当前类属性的值。
  • @Rolice,如果我使用parent:: 来引用父类,我仍然必须手动调用父构造函数(通过parent::__construct(),对吗?不这样做会引发 PHP 错误。
  • 是的,在子构造函数中,如果他做了一些重要的操作(见更新的答案)。
【解决方案2】:

扩展Rolice的答案

function a() {
  echo 'I exist everywhere';
}
class A {
  protected $a
  function a() {
    $this->a = 'I have been called';
  }
  function out() {
    echo $this->a;
    a();
  }
}
class B extends A {
  function __construct() {
    parent::a();// original method
    $this->a(); // overridden method
    a();
  }
  function a() {
    $this->a = $this->a ? 'I have been overwritten' : 'first call';
  }
}

研究这些以了解差异

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2018-06-16
    • 1970-01-01
    • 2017-02-13
    • 2011-03-24
    相关资源
    最近更新 更多