父级::p在 PHP 中很老练

2022-08-30 10:27:52

我搜索一种访问类的父函数,父函数的方法,而无需调用父函数...嗯,这听起来有点奇怪的解释,所以我会举个例子:

class myclass
{
  public function test() { return 'level 1'; }
}
class myclass2 extends myclass
{
  public function test() { return parent::test() . '-level 2'; }
}
class myclass3 extends myclass2
{
  public function test() { return parent::test() . '-level 3'; }
}
$example = new myclass3();
echo $example->test(); // should display "level 1-level 2-level 3"

我想显示“级别1 - 级别3”,然后执行类似操作:

class myclass3 extends myclass2
{
  public function test() { return parent::parent::test() . '-level 3'; }
}

您知道我该怎么做吗?(我不允许编辑myclass和myclass2,它们是框架的一部分...)


答案 1

简单的解决方案。直接使用根对象 myclass:

class myclass3 extends myclass2
{
  public function test() { return myclass::test() . '-level 3'; }
}

如果您需要更通用的方法,请查看outis答案


答案 2

您可以使用get_parent_class

function get_grandparent_class($thing) {
    if (is_object($thing)) {
        $thing = get_class($thing);
    }
    return get_parent_class(get_parent_class($thing));
}

class myclass3 extends myclass2 {
    public function test() {
      $grandparent = get_grandparent_class($this);
      return $grandparent::test() . '-level 3'; 
    }
}

或者您可以使用反射

function get_grandparent_class($thing) {
    if (is_object($thing)) {
        $thing = get_class($thing);
    }
    $class = new ReflectionClass($thing);
    return $class->getParentClass()->getParentClass()->getName();
}

但是,这可能不是一个好主意,具体取决于您要实现的目标。


推荐