[英]How to call a overrided method in child, on the parent class
我上课了
class foo {
function do_something() {
load();
}
function load() {
//things
echo 'load from foo';
}
}
还有另一个扩展foo的类(子类):
class bar extends foo {
function load() {
//things
echo 'load from bar (child)';
}
}
接着:
$obj = new bar();
我想知道的是如何调用$obj->do_something()
,以便该方法使用子级“ load”方法而不是foo类中声明的方法。
因此,我希望输出为:
$obj->do_something();
输出: load from bar (child)
PHP有可能吗?
谢谢!
您需要使用$this
限定对象上下文。 与某些其他语言不同,PHP要求您为对象内的所有方法调用使用$this
显式限定实例。
class foo {
function do_something() {
// load();
$this->load();
}
function load() {
echo 'load from foo';
}
}
class bar extends foo {
function load() {
echo 'load from bar (child)';
}
}
$obj = new bar();
$obj->do_something();
在您的代码中( 仅调用load()
),该语言正在寻找一个名为load
的全局定义函数,该函数当然不起作用( 或者在更坏的情况下,但会错误地 )
另一个答案指出,您必须通过使用self
或static
来类似地限定static方法( 我建议您继续阅读以了解绑定差异 )
在继承类的覆盖方法中,您还可以使用parent
来调用方法的父类的定义:
class bar extends foo {
function load() {
parent::load(); // right here
echo 'load from bar (child)';
}
}
这将调用父方法的load
方法版本,并继续使用子类的定义执行。
如果您希望方法之间紧密结合,我建议您使用抽象函数。 这将需要大量维护,并且您将在类之间创建一些紧密的耦合。
我建议在父级中创建一个抽象函数,每个子级将使用其自己的逻辑来实现。
即使这样,如果您想将父类函数更改为此
function do_something(){
if(method_exists($this, 'test')){
$this->test();
}
}
您可以使用抽象类和抽象方法:
abstract class Foo{
function test() {
$this->method();
}
abstract function method();
}
class Test extends Foo {
function method() {
echo 'class Test';
}
}
$test = new Test();
$test->test();
尝试这个
class foo {
function do_something() {
static::load();
}
function load() {
//things
echo 'load from foo';
}
}
class bar extends foo {
function load() {
//things
echo 'load from bar (child)';
}
}
$obj = new bar;
$obj->do_something();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.