说我有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()
方法肯定不起作用...
答案 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';
}
}
研究这些以了解差异