2011-01-26 98 views
0

我正在努力確定繼承的深度。PHP類繼承深度

例如,如果我開始與A類

B類延伸類A
C類延伸的B類
d類延伸的C類
E類延伸d類
類F的延伸E類
G類擴展F類

大多數較低級別是抽象類,其中包含代碼和抽象方法。它是一個相當龐大而複雜的結構。 (盡我所能)

G類仍然能夠訪問A類方法和參數,並且仍然可以訪問A類的抽象方法嗎?

我在問,因爲我一直在eclipse中遇到麻煩,無法將低級方法添加到auto complete中。我想知道是否真的有這個限制,或者只是eclipse達到代碼完成的最大值。

我遠離一個階段,我可以測試這與我做了什麼,不想找到當我完成後,方法定義較低的方法無法訪問。

回答

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不會對您施加任何類似的限制。

+0

感謝您的幫助。 – roguecoder 2011-01-26 23:16:14

2

使用canonical test這樣的:

<?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 2011-01-26 23:15:28

+0

我不認爲有'繼承水平'的明確限制。這不像你需要把所有父類放在某個可能會溢出的棧上。如果有的話,加載所有父類的必要性將意味着腳本的可用內存是實際的限制。 – Mchl 2011-01-26 23:26:37

-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的深度,它仍然運作得很好,所以你絕對可以,聽起來像是你的編輯器插件只在繼承樹中看起來如此之深