如何从继承的方法中调用PHP父方法?

如何从继承的方法中调用PHP父方法?,php,inheritance,object,methods,parent,Php,Inheritance,Object,Methods,Parent,在PHP中,我试图引用对象父类中定义的方法,该方法是从对象父类继承的方法。代码如下: class base_class { function do_something() { print "base_class::do_something()\n"; } function inherit_this() { parent::do_something(); } } class middle_class extends base_class { function d

在PHP中,我试图引用对象父类中定义的方法,该方法是从对象父类继承的方法。代码如下:

class base_class {
  function do_something() {
    print "base_class::do_something()\n";
  }
  function inherit_this() {
    parent::do_something();
  }
}
class middle_class extends base_class {
  function do_something() {
    print "middle_class::do_something()\n";
  }
}
class top_class extends middle_class {
  function do_something() {
    print "top_class::do_something()\n";
    $this->inherit_this();
  }
}

$obj = new top_class;
$obj->do_something();

问题是,inherit_this()中的parent::do_something()尝试查找基类的父类,而不是对象实际类的父类,而上面的示例抛出了一个错误。有什么东西可以代替parent::do_something()来调用middle_class::do_something(),即使在扩展(比如)top_class的类中,它仍然可以工作吗?

要使它工作,您可以这样修改基类:

class base_class {
  function do_something() {
    print "base_class::do_something()\n";
  }

 function inherit_this() {
    $this->do_something();
 }
}
class base_class {
  function do_something() {
    print "base_class::do_something()\n";
  }

  function inherit_this() {
     base_class::do_something();
  }
class base_class {
  function do_something() {
    print "base_class::do_something()\n";
  }
  function inherit_this() {    
    $par = get_parent_class($this);
    $par::do_something();
  }
}
然后,您的顶级类将调用基类的inherit_this(),但会有一个递归:顶级类的do_something()调用$this->inherit_this(),在基类中,您再次调用$this->do_something()(在基类中,$this将引用您的顶级类)。因此,您将反复调用inherit_this()

您应该重命名这些方法以防止出现这种情况

更新

如果您希望基类继承\u this()打印“基类::do\u something”,您可以这样修改基类:

class base_class {
  function do_something() {
    print "base_class::do_something()\n";
  }

 function inherit_this() {
    $this->do_something();
 }
}
class base_class {
  function do_something() {
    print "base_class::do_something()\n";
  }

  function inherit_this() {
     base_class::do_something();
  }
class base_class {
  function do_something() {
    print "base_class::do_something()\n";
  }
  function inherit_this() {    
    $par = get_parent_class($this);
    $par::do_something();
  }
}
}

在本例中,对基类方法do\u something()进行静态调用。输出是
top\u class::do\u something()base\u class::do\u something()

更新2

关于您的评论,您可以这样修改您的基本类:

class base_class {
  function do_something() {
    print "base_class::do_something()\n";
  }

 function inherit_this() {
    $this->do_something();
 }
}
class base_class {
  function do_something() {
    print "base_class::do_something()\n";
  }

  function inherit_this() {
     base_class::do_something();
  }
class base_class {
  function do_something() {
    print "base_class::do_something()\n";
  }
  function inherit_this() {    
    $par = get_parent_class($this);
    $par::do_something();
  }
}

获得$this的parrent类,然后调用该方法。输出将是:
top\u class::do\u something()middle\u class::do\u something()

我不太明白你为什么要这样做。但我想你做不到。我知道你将能够创建一个中间类2,并且能够从中继承,然后它将是中间类2,而不是你称之为中间类的东西

所以我想你需要创建

  function inherit_this() {
    parent::do_something();
  }
在中产阶级

我想到了一个get_类($这个)::parent::do_something()。。但那没用

只是为了确定。。你想叫中产阶级::做点什么()对吗

首先,我要对grrbrr404说声“谢谢”。他给了我一些想法,让我朝着正确的方向开始

我最终确定的解决方案如下:

function inherit_this() {
  $bt = debug_backtrace();
  call_user_func(array($this, get_parent_class($bt[1]['class']) . '::do_something'));
}

它不漂亮(我特别讨厌调用<代码> Debug),但是它将对象上下文设置为$$,并处理从对象层次结构中间的某个方法调用方法的情况。 对于那些认为我的示例令人困惑和/或想知道“为什么要这样做?”的人,我表示歉意,并提供以下附加示例,希望它更具说明性,更接近原始问题。它相当长,但希望能说明为什么我关心如何正确地保留$this集,并说明为什么我不能硬编码任何特定的类名或使用$this->method()。避免无限循环始终是我的首要任务。:-)

我试图避免“checkType()”函数的重复,但即使层次结构变得任意大,仍能提供正确的行为


当然,更优雅的解决方案是最受欢迎的。

您不能使用php5,然后创建一个基类专用的方法吗?这意味着继承类不能重写该方法。也许,但我实际上希望interiting类重写该方法。这实际上是原始代码的大部分要点。我可能需要重写这个示例,但它会更长。我想让它调用middle_class::do_something(),因为真正的代码以不同的方式为层次结构的每一层处理数据,我想遍历层次结构,一直到基础,而不在每一层重新实现inherit_this()。这似乎是可行的,但我无法摆脱这样的感觉:它可能会在以后引入一些难以发现的bug,因为它实际上将middle_class::do_something()作为静态方法调用,而不是$this上的方法$这只是因为PHP的奇怪作用域才保持不变。我还没有想到一个例子,它会崩溃,但我很紧张。我想也许
call\u user\u func(数组($this,get\u parent\u class($this)。“::do\u something”)
可能会更好,但我也感觉不太好。嗯,是的,php中的OOP通常有点奇怪。。。出于调试目的,您可以在类中实现一个特殊的调试标志,并使用一些“神奇常量”。有了它们,通常很容易发现发生了什么。查看本页了解更多信息:进一步思考后,我意识到该方法不适用于由top_类的祖先类定义的方法调用inherit_this()的情况。例如,如果它被
中间类::do\u something()
调用,它将导致无限循环。然而,我确实设计了一个解决方案,涉及
debug\u backtrace()
(糟糕),这似乎是可行的。我在一个单独的答案中写下了详细信息和一个较长的示例。正确,完全可以访问$this的属性和方法
class base_class {
  function do_something() {
    print "base_class::do_something()\n";
  }
  function inherit_this() {
   //parent::do_something();
     $class = get_called_class();
     $class::do_something();
  }
}