2016-06-22 174 views
1

可以说,我有这样的代码:多层次继承

架构或不好的设计
class A { 
    ... 
} 

class B extends A { 
    ... 
} 

class C extends B { 
    ... 
} 

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

其他将在对PHP/Web服务器产生任何影响(阿帕奇/ Nginx的)性能时,该脚本执行?

如果不建议在PHP类中使用这种多级别,您能解释为什么吗?

注:除了我有我会让this这里的答案,这是有帮助的,以及

+0

对我来说似乎很好,但这个例子非常狭窄。 –

+0

我可能不会担心性能的影响,除非你进入更深的嵌套(阅读:不现实的)继承,或者你的类的内容非常密集。如果您的应用程序的设计需要(即)20个级别的继承,那就这样吧。根据您的需求,它最终可能是可维护性/可读性和性能之间的折衷。 –

+0

谁说这是一个不好的做法? (你能链接一些来源吗?) –

回答

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 
    } 
} 
0

这似乎完全正常。 PHP只支持单继承 - 所以你只能从一个类继承。 如果您需要班级中的更多功能,但无法获得父级班级的功能,您还可以考虑使用traits。性状尝试解决单遗传问题 - 即使它本身不是问题。

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