繁体   English   中英

如何在父类的子级中调用重写的方法

[英]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的全局定义函数,该函数当然不起作用( 或者在更坏的情况下,但会错误地

另一个答案指出,您必须通过使用selfstatic来类似地限定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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM