2011-01-26 11 views
0

私は、正確にどの程度深い継承が行われるのかを試しています。私はクラスで始まる場合PHPクラスの継承の深さ

クラスBがクラス
クラスC、クラスD、クラスC
クラスEクラスD
クラスFクラスE
を拡張延びて延びているクラスB
を拡張延び例えば

クラス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() 

このような制限はありません。このような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{ 

} 
?> 

1は、その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