如何在PHP中的子构造函数中访问父级方法?

时间:2013-12-10 12:26:28

标签: php class oop inheritance

说我有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?
    }  
}

假设我想调用parent的{​​{1}}方法,我是否必须在子构造函数中调用父实例的新实例?像这样......

run()

如果是这样,来自类定义POV的$var = new Parent(); $var->run($someArgument); 有什么意义?我可以使用extends关键字调用另一个类的新实例,无论它是否扩展了'child'。

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

因为使用extend关键字引用父级的run()方法肯定不起作用...

2 个答案:

答案 0 :(得分:4)

使用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),它将再次调用父运行方法。

答案 1 :(得分:0)

扩展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';
  }
}

研究这些以了解差异