PHP调用超级父方法

时间:2016-06-22 13:54:41

标签: php oop

我根本不确定是否有这样的术语,但这就是我想做的事情

class A {
    function a($a) {
        return $a;
    }
}

class B extends A {
    function a($a) {
        return parent::a('B' . $a);
    }
}

class C extends B {
    function a($a) {
        return superparent::a('C' . $a);
    }
}

$c = new C();
echo $c->a('C'); // "CC"

我想绕过所有的medial类并在第一次定义它的父级上调用该函数 - 这可能吗?

4 个答案:

答案 0 :(得分:6)

不,这是一个糟糕的主意。您的所有课程C都知道它扩展了B。它不知道也不应该知道B延伸到什么地方。 C不能指望B扩展任何内容,也不应该知道该父母的具体方法及其实现细节。您可能明天重构B以扩展另一个类,或者根本不扩展任何类。如果您建立了这样的三级交叉依赖关系,代码将开始左右打破。

类只应通过继承或依赖注入与它们直接关联的对等体进行交互。

从逻辑上讲:B A的行为添加必要的内容,使其成为“B”,并添加C要成为C的东西。 C建立在B之上,因此B C所做的任何事情都应该如此。让C“跳过”BA表示您的逻辑和职责分配在您的班级层次结构中混淆。

答案 1 :(得分:2)

尽管有任何工程软件投诉(你想要做的事情是必须通过其他方法实现的),我认为我的两个例子都适合工作:

使用特征:

<?php

trait Bypass_trait {
    public function super_ref() {
        return parent::super_ref();
    }
}

class A {
    function a($a) {
        return $a;
    }

    function super_ref() {
      return $this;
    }
}

class B extends A {
    use Bypass_trait;

    function a($a) {
        return $this->super_ref()->a('B' . $a);
    }
}

class C extends B {
    use Bypass_trait;

    function a($a) {
        return $this->super_ref()->a('C' . $a);
    }
}

$c = new C();
echo $c->a('C'); // "CC"

使用界面:

<?php

interface Bypass {
  public function super_ref();
}

class A implements Bypass {
    function a($a) {
        return $a;
    }

    function super_ref() {
      return $this;
    }
}

class B extends A implements Bypass {
    function a($a) {
        return $this->super_ref()->a('B' . $a);
    }

    function super_ref() {
      return parent::super_ref();
    }
}

class C extends B implements Bypass {
    function a($a) {
        return $this->super_ref()->a('C' . $a);
    }

    function super_ref() {
      return parent::super_ref();
    }
}

$c = new C();
echo $c->a('C'); // "CC"

答案 2 :(得分:-1)

我可以将“A”视为抽象,然后让b和c覆盖它

答案 3 :(得分:-1)

您可以选择使用A::a('C' . $a)调用哪种父方法。

调用像这样的父函数时,它不会静态调用它,就像parent::a()一样。