我有一个班级
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吗?
谢谢!
答案 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
的全局定义函数,这当然不起作用(或在更糟糕的情况下,会错误地)
正如另一个答案所指出的那样,你必须同样限定静态方法,尽管使用self
或static
(我建议你阅读以理解绑定差异)
在继承类中,在重写方法中,您还可以使用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();