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

时间:2013-05-11 15:44:26

标签: php class method-overriding

我有一个班级

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吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

您需要使用$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我建议你阅读以理解绑定差异

在继承类中,在重写方法中,您还可以使用parent来调用父类的方法定义:

class bar extends foo {
    function load() {
        parent::load(); // right here
        echo 'load from bar (child)';
    }
}

这将调用父load方法的版本,并继续执行子类的定义。

答案 1 :(得分:0)

如果你想拥有如此紧密的方法耦合,我建议使用抽象函数。这将需要高度的维护,你在课间创造了一些紧密的联系。

我建议在父母中创建一个抽象函数,每个孩子都会用它自己的逻辑来实现。

即便如此,如果您想将您的父类功能更改为此

function do_something(){
    if(method_exists($this, 'test')){
        $this->test();
    }
}

答案 2 :(得分:0)

你可以使用抽象类和抽象方法:

abstract class Foo{
   function test() {
      $this->method();
   }
   abstract function method();
}
class Test extends Foo {
   function method() {
      echo 'class Test';
   }
}
$test = new Test();
$test->test();

答案 3 :(得分:-1)

试试这个

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();