0

我有一堂课

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()该方法以使该方法使用子“加载”方法而不是在 foo 类中声明的方法。

所以,我希望输出是:

$obj->do_something();

输出: load from bar (child)

这可以用PHP吗?

谢谢!

4

4 回答 4

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,这当然不起作用(或者在更糟糕的情况下,会但不正确

正如另一个答案指出的那样,您必须通过使用self或类似地限定静态方法static我建议您阅读以了解绑定差异

从继承类中,在覆盖方法中,您还可以使用parent调用父类的方法定义:

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

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

于 2013-05-11T15:53:34.160 回答
0

如果您想拥有如此紧密的方法耦合,我建议您使用抽象函数。这将需要高度维护,并且您正在类之间创建一些紧密耦合。

我建议在父级中创建一个抽象函数,每个子级都将使用自己的逻辑来实现。

即使那样,如果您想将父类函数更改为此

function do_something(){
    if(method_exists($this, 'test')){
        $this->test();
    }
}
于 2013-05-11T15:51:08.653 回答
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();
于 2013-05-11T15:58:16.327 回答
-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();
于 2013-05-11T15:49:50.423 回答