PHP类中的多级继承

时间:2016-06-22 15:32:32

标签: php oop architecture php-7

假设我有这段代码:

class A {
   ...
}

class B extends A {
   ...
}

class C extends B {
   ...
}

$c = new C();
$c->getMethodOrPropertyFromB()->getMethodOrPropertyFromA();

除了糟糕的架构或糟糕的设计外,这会对脚本执行时的PHP / Webserver(Apache / Nginx)性能产生什么影响?

如果不建议在PHP类中使用这样的多级,你能解释一下原因吗?

注意:除了我得到的答案之外,我还会在this这里提供帮助

2 个答案:

答案 0 :(得分:1)

这似乎完全没问题。 PHP仅支持单继承 - 因此您只能从一个类继承。 如果您在课程中需要更多功能但无法在父课程中获得乐趣,您还可以考虑使用traits。 Traits 尝试来解决单一继承问题 - 即使它本身并不是问题。

如果你正确地构建了类,你会获得一个很好的继承链,它对Apache / Nginx没有任何不良影响。

答案 1 :(得分:1)

我最初的想法是,这可能不适合继承,但经过测试似乎没问题。但是,您还可以通过其他方式实现这一目标。

抽象类或接口可能有意义。

抽象类与其他类一样,但无法实例化。还有一些必须由具体类实现的抽象方法。

abstract class A {
    //You can also have abstract methods
    abstract public function doFoo();
    abstract public function doBar($when);

    //Also implemented method which when
    //called unless overridden will use this logic
    public function sayHi(){
        echo "hi";
    }
}

现在这个类可以选择实现抽象方法,也可以不添加它所需的任何其他逻辑。

abstract class B extends A {
    public function doFoo(){
        //Some code
    }
    abstract public function doFooBar();
    public function sayBye(){
        echo "bye";
    }
}

这是一个具体的类,所有抽象方法必须在这里实现,如果不是已经实现的方法可以再次被覆盖。

class C extends B {
    public function doFoo(){
        //Some different code
    }
    public function doBar($when){
        //Some code
    }
    public function doFooBar(){
        //Some code
    }

    //do not need sayHi() and  sayBye() but they will be available.
}

简单粗暴的界面是一包方法。您只是告诉开发人员您是否打算使用这些工具。这些方法未声明为抽象,但无法在界面中实现。

interface iA {
    public function doFoo();
    public function doBar();
}

接口可以通过其他接口扩展,这只是向接口添加更多方法

interface iB extends iA {
    public function doFooBar();
}

interface iC {
    public function doAnything();
}

由班级实施

class A implements iA{
    public function doFoo(){
        //Some Code
    }
    public function doBar(){
        //Some Code
    }
}

class B implements iB{
    public function doFoo(){
        //Some Code
    }
    public function doBar(){
        //Some Code
    }
    public function doFooBar(){
        //Some Code
    }   
}

接口的附加优势是类或抽象可以实现多个

abstract class C implements iA, iC {
    public function doFoo(){
        //Some Code
    }
}

class D extends C {
    //get doFoo() from C implementation and must implement the remaining...
    public function doBar(){
        //Some Code
    }
    public function doAnything(){
        //Some Code
    }
}