2011-01-26 6 views
0

정확하게 상속이 얼마나 진행되는지 알아 내려고합니다.PHP 클래스 상속 깊이

I 클래스로 시작할

클래스 B가
클래스 C는 클래스 B를 확장 클래스를 확장하는 경우
클래스 D 클래스 C를 확장
클래스 E 클래스 D 확장
클래스 F 클래스 E
확장 클래스 G는 클래스 F를 확장합니다.

하위 수준의 대부분은 코드와 추상 메서드로 채워진 메서드가있는 추상 클래스입니다. 그것의 다소 크고 복잡한 구조. (내 머리 속에서)

클래스 G는 여전히 클래스 A 메서드와 매개 변수에 액세스 할 수있을뿐만 아니라 클래스 A의 추상 메서드에도 액세스 할 수 있습니까?

나는 자동 완성에 하위 클래스 메서드를 추가하지 않는 식으로 문제가 발생했기 때문에 묻습니다. 실제로 제한이 있는지, 아니면 코드 완성을 위해 최대치에 도달했는지 여부를 알고 싶습니다.

나는 내가 한 일로 이것을 시험해 볼 수있는 단계가 아니며, 그 순서대로 더 낮은 순서로 정의 된 접근법이 접근 가능하지 않을 때 찾기를 원하지 않는다.

답변

3

편집기에 문제가있는 것 같습니다. 예를 들어, 다음과 같은 빠른 - 및 - 더러운 데모를 참조하십시오

php > class a { function foo() { echo "A::foo()\n"; } } 
php > $letters = range('a', 'z'); 
php > for ($i = 0; $i < 25; $i++) { eval("class {$letters[$i+1]} extends {$letters[$i]} {}"); } 
php > $z = new z; 
php > $z->foo(); 
A::foo() 

PHP는 당신과 같은 제한의 종류를 부과하지 않습니다. 이 같은 canonical test를 사용

+0

도움을 주셔서 감사합니다. – roguecoder

2

:

<?php 
abstract class A { 
    abstract function getValue(); 
} 
abstract class B extends A{ } 
abstract class C extends B{ } 
abstract class D extends C{ } 
abstract class E extends D{ } 
abstract class F extends E{ } 
class G extends F{ 

} 
?> 

하나가 G에 치명적인 오류가 사실 A에 정의 된 추상 메소드를 구현하지 않습니다 기대. 위의 링크에서 볼 수 있듯이 사실입니다.

따라서 이것은 깊은 상속이지만 PHP의 제한 사항 (있는 경우) 아래에 있습니다. 오히려 PDT에서 인덱서 문제가 발생할 가능성이 큽니다.

+0

고마워. 나는 이것이 문제라고 의심했다. 그러나 나는 단지 확실하지 않았다. 나는 또한이 구조에 실제 한도가 있는지 알아 내려고 애썼다. – roguecoder

+0

'상속 수준'에 대한 명시적인 제한이 있다고 생각하지 않습니다. 모든 부모 클래스를 오버플로 또는 무언가의 스택에 둘 필요가있는 것처럼 아닙니다. 모든 부모 클래스를로드해야 할 필요성이 생기면 스크립트에서 사용할 수있는 메모리가 실제 한계가된다는 의미입니다. – Mchl

-1

다음 PHP :

class A 
{ 
    public function FooA() 
    { 
     echo "A!!"; 
    } 
} 

class B extends A 
{ 
    public function FooB() 
    { 
     echo "B!!"; 
    } 
} 

class C extends B 
{ 
    public function FooC() 
    { 
     parent::FooB(); 
     parent::FooA(); 
    } 
} 

$test = new C(); 
$test->FooC(); 

인쇄 :

B!!A!!

나는 50의 깊이에서이 테스트하고 그것은 여전히 ​​당신은 확실히 할 수 있도록, 편집기 같은 소리, 잘 작용 플러그인은 상속 트리에서 너무 깊게 보입니다.

+0

질문을 한 번 더 읽으십시오. – KingCrunch