2016-06-22 4 views
1

는이 코드가 있다고 가정하자하십시오 나쁜 아키텍처 또는 나쁜 디자인보다는멀티 레벨 상속은

class A { 
    ... 
} 

class B extends A { 
    ... 
} 

class C extends B { 
    ... 
} 

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

다른이 PHP/웹 서버에 어떤 영향을 미칠 것이다 (아파치/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"; 
    } 
} 

이것은 구현 된 클래스가 아직 재정의 될 수없는 경우 모든 구체적인 메소드를 여기에 구현해야합니다.

인터페이스는 간단하고 비싼 방법은 방법 모음입니다. 당신은 단순히 개발자에게 이것이 이것을 구현할 것인지를 말하고 있습니다. 이 메소드는 추상으로 선언되지 않지만 인터페이스에서 구현 될 수는 없습니다.

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에 나쁜 영향을 미치지 않는 우수한 상속 체인을 갖게됩니다.